標(biāo)題:
基于STM32簡(jiǎn)易電機(jī)伺服控制器源碼
[打印本頁]
作者:
南山Ⅰ
時(shí)間:
2017-8-23 10:57
標(biāo)題:
基于STM32簡(jiǎn)易電機(jī)伺服控制器源碼
簡(jiǎn)單電機(jī)伺服控制器實(shí)例全在壓縮包里,超級(jí)實(shí)用
STM32單片機(jī)源程序如下:
#include "BSP.h"
/*****************************************
Author :JasonLin
Version :V2.0 Ownership-Reserved
Description:MCIO Board support package
*****************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組2 兩位搶占(0-3) 兩位響應(yīng)(0-3)=
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
///////////////////////////////////////CAN 0 1
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*****************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*優(yōu)先級(jí)分組:優(yōu)先級(jí)分組是為了給搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)在中斷優(yōu)先級(jí)寄存器的高四位分配各自所占的位數(shù)
在同一個(gè)程序中優(yōu)先級(jí)分組只能設(shè)定一次 */
/*搶占優(yōu)先級(jí): 當(dāng)一個(gè)中斷正在執(zhí)行而另一個(gè)具有更高搶占優(yōu)先級(jí)的中斷到來時(shí),搶占優(yōu)先級(jí)高的就會(huì)搶占CPU處理權(quán)
此時(shí)兩個(gè)中斷就屬于嵌套中斷關(guān)系,具有相同搶占優(yōu)先級(jí)的中斷沒有嵌套關(guān)系*/
/*響應(yīng)優(yōu)先級(jí):即副優(yōu)先級(jí),當(dāng)兩個(gè)搶占優(yōu)先級(jí)相同的中斷同時(shí)到來,具有響應(yīng)優(yōu)先級(jí)高的中斷優(yōu)先獲得CPU的處理權(quán)
如果中斷不是同時(shí)到來,則后來的要等待正在執(zhí)行的中斷處理完才能獲得響應(yīng)*/
}
///////////////////定時(shí)器功能初始化
void TIM1_Configuration(void)//TIM1四通道分別輸出PWM1/PWM2/PWM3/PWM4,對(duì)應(yīng)引腳為PA8/PA9/PA10/PA11
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用滿負(fù)載輸出為3.3V
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = PWMPeriod;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM1->CCR1 = 3600;
TIM1->CCR2 = 3600;
TIM1->CCR3 = 3600;
TIM1->CCR4 = 3600;
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
////////////////////////////
void TIM8_Configuration(void)//TIM8四通道分別輸出PWM1/PWM2/PWM3/PWM4,對(duì)應(yīng)引腳為PC6/PC7/PC8/PC9
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = PWMPeriod;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC4Init(TIM8, &TIM_OCInitStructure);
TIM8->CCR1 = 3600;
TIM8->CCR2 = 3600;
TIM8->CCR3 = 3600;
TIM8->CCR4 = 3600;
TIM_Cmd(TIM8, ENABLE);
TIM_CtrlPWMOutputs(TIM8, ENABLE);
}
/////////////////////////////
void TIM2_Configuration(void)//編碼器接口設(shè)置(TIM2)/PA15-A相 PB3-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //關(guān)閉JTAG接口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //關(guān)閉JTAG接口 開啟SWD
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE); //TIM2引腳重定向
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_15,Bit_SET);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 不分頻
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//設(shè)置定時(shí)器2為編碼器模式 IT1 IT2為上升沿計(jì)數(shù)
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //輸入濾波器
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除所有標(biāo)志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //允許中斷更新
TIM2->CNT = 0;
TIM_Cmd(TIM2, ENABLE);
}
///////////////////////////
void TIM3_Configuration(void)//編碼器接口設(shè)置(TIM3)/PA6-A相 PA7-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIOA外設(shè)時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置為上拉輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口的速率為50M
GPIO_Init(GPIOA, &GPIO_InitStructure); //IO口配置函數(shù)
GPIO_WriteBit(GPIOA, GPIO_Pin_6,Bit_SET);
GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 不分頻
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//設(shè)置定時(shí)器3為編碼器模式 IT1 IT2為上升沿計(jì)數(shù)
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //輸入濾波器
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除所有標(biāo)志位
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //允許中斷更新
TIM3->CNT = 0;
TIM_Cmd(TIM3, ENABLE);
}
///////////////////////////
void TIM4_Configuration(void)//編碼器接口設(shè)置(TIM4)/PB6-A相 PB7-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能GPIOB外設(shè)時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置為上拉輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口的速率為50M
GPIO_Init(GPIOB, &GPIO_InitStructure); //IO口配置函數(shù)
GPIO_WriteBit(GPIOB, GPIO_Pin_6,Bit_SET);
GPIO_WriteBit(GPIOB, GPIO_Pin_7,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//設(shè)置定時(shí)器3為編碼器模式 IT1 IT2為上升沿計(jì)數(shù)
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //輸入濾波器
TIM_ICInit(TIM4, &TIM_ICInitStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除所有標(biāo)志位
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允許中斷更新
TIM4->CNT = 0;
TIM_Cmd(TIM4, ENABLE);
}
///////////////////////////
void TIM5_Configuration(void)//編碼器接口設(shè)置(TIM5)/PA0-A相 PA1-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);
GPIO_WriteBit(GPIOA, GPIO_Pin_1,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
//設(shè)置定時(shí)器3為編碼器模式 IT1 IT2為上升沿計(jì)數(shù)
TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6;
TIM_ICInit(TIM5, &TIM_ICInitStructure);
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
TIM5->CNT = 0;
TIM_Cmd(TIM5, ENABLE);
}
/////////////////////
void TIM6_Configuration(void)//周期循環(huán)事件定時(shí)初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructure.TIM_Period = TIMPeriod-1;
TIM_TimeBaseStructure.TIM_Prescaler =72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Regular);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM6,ENABLE);
}
////////////////////
void TIM7_Configuration(void)//周期循環(huán)事件定時(shí)初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
TIM_TimeBaseStructure.TIM_Period = TIMPeriod-1;
TIM_TimeBaseStructure.TIM_Prescaler =72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);
TIM_UpdateRequestConfig(TIM7,TIM_UpdateSource_Regular);
TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM7,ENABLE);
}
//////////////////////////
void TIM_Configuration(void)//TIM初始化
{
TIM1_Configuration();
TIM8_Configuration();
TIM2_Configuration();
TIM3_Configuration();
TIM4_Configuration();
TIM5_Configuration();
TIM6_Configuration();
TIM7_Configuration();
}
///////////////////////電機(jī)速度寫入接口
void MotorSpeedSetOne(s32 MotorSpeed)//電機(jī)1轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(TIM1)
{
s32 PwmOne_Set,PwmOne_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmOne_Set = -MotorSpeed; PwmOne_Mode = MotorOneBack;}
else { PwmOne_Set = MotorSpeed; PwmOne_Mode = MotorOneForward;}
if(PwmOne_Mode) {TIM1->CCR1 = MotorSpdZero; TIM1->CCR2 = PwmOne_Set;} //MotorOneForward
else { TIM1->CCR1 = PwmOne_Set; TIM1->CCR2 = MotorSpdZero;} //MotorOneBack
}
////////////////////////////////
void MotorSpeedSetTwo(s32 MotorSpeed)//電機(jī)2轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(TIM1)
{
s32 PwmTwo_Set,PwmTwo_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmTwo_Set = -MotorSpeed; PwmTwo_Mode = MotorTwoBack;}
else { PwmTwo_Set = MotorSpeed; PwmTwo_Mode = MotorTwoForward;}
if(PwmTwo_Mode) {TIM1->CCR3 = MotorSpdZero; TIM1->CCR4 = PwmTwo_Set;} //MotorTwoForward
else { TIM1->CCR3 = PwmTwo_Set; TIM1->CCR4 = MotorSpdZero;} //MotorTwoBack
}
////////////////////////////////
void MotorSpeedSetThr(s32 MotorSpeed)//電機(jī)3轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(TIM8)
{
s32 PwmOne_Set,PwmOne_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmOne_Set = -MotorSpeed; PwmOne_Mode = MotorOneBack;}
else { PwmOne_Set = MotorSpeed; PwmOne_Mode = MotorOneForward;}
if(PwmOne_Mode) {TIM8->CCR1 = MotorSpdZero; TIM8->CCR2 = PwmOne_Set;} //MotorOneForward
else { TIM8->CCR1 = PwmOne_Set; TIM8->CCR2 = MotorSpdZero;} //MotorOneBack
}
////////////////////////////////
void MotorSpeedSetFou(s32 MotorSpeed)//電機(jī)4轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(TIM8)
{
s32 PwmTwo_Set,PwmTwo_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmTwo_Set = -MotorSpeed; PwmTwo_Mode = MotorTwoBack;}
else { PwmTwo_Set = MotorSpeed; PwmTwo_Mode = MotorTwoForward;}
if(PwmTwo_Mode) {TIM8->CCR3 = MotorSpdZero; TIM8->CCR4 = PwmTwo_Set;} //MotorTwoForward
else { TIM8->CCR3 = PwmTwo_Set; TIM8->CCR4 = MotorSpdZero;} //MotorTwoBack
}
///////////LED 初始化
void Led_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
}
//////SYSTICK 初始化
void Systick_Configuration(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時(shí)鐘 HCLK/8 9M
}
//////延時(shí)寫入接口
void SysDelay_ms(u16 nms)//72M條件下,nms<=1864(2^24/9000)
{
u32 temp;
SysTick->LOAD=(u32)nms*Sys_ms;//時(shí)間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計(jì)數(shù)器
SysTick->CTRL=0x01; //開始倒數(shù)
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)
SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
void SysDelay_us(u32 nus)//72M條件下,nus<=2^24
{
u32 temp;
SysTick->LOAD=nus*Sys_us; //時(shí)間加載
SysTick->VAL=0x00; //清空計(jì)數(shù)器
SysTick->CTRL=0x01; //開始倒數(shù)
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)
SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
///////Board Communication Package
unsigned char sbus_rx_buffer[18];
RC_Ctl_t RC_Ctl;
void USART3_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART1 clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* USART3 mode config */
USART_InitStructure.USART_BaudRate = 100000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx ;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
}
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //開啟DMA時(shí)鐘
/*設(shè)置DMA源:內(nèi)存地址&串口數(shù)據(jù)寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&(USART3->DR);
/*內(nèi)存地址(要傳輸?shù)淖兞康闹羔?*/
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)sbus_rx_buffer;
/*方向:從外設(shè)到內(nèi)存*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ;
/*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/
DMA_InitStructure.DMA_BufferSize = 18;
/*外設(shè)地址不增*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
/*內(nèi)存地址自增*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
/*外設(shè)數(shù)據(jù)單位*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/*內(nèi)存數(shù)據(jù)單位 8bit*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/*DMA模式:循環(huán)*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;
/*優(yōu)先級(jí):非常高*/
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
/*禁止內(nèi)存到內(nèi)存的傳輸 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/*配置DMA1的3通道*/
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DMA_Cmd (DMA1_Channel3,ENABLE); //使能DMA
DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE); //配置DMA發(fā)送完成后產(chǎn)生中斷
}
//////Board Support Package
void BSP_Configuration(void)
{
NVIC_Configuration();
TIM_Configuration();
Led_Configuration();
Systick_Configuration();
USART3_Config();
DMA_Config();
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
}
///////////編碼器讀取
EncoderType GetEncoder;
void Get_Encoder_ONE(void)
{
s32 CNT2_temp,CNT2_last;
GetEncoder.cnt2 = TIM2 -> CNT;
CNT2_last = GetEncoder.CNT2;
CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
GetEncoder.V2 = CNT2_temp - CNT2_last;
while ((s32)(GetEncoder.V2)>Vbreak)
{
GetEncoder.rcnt2--;
CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
GetEncoder.V2 = CNT2_temp - CNT2_last;
}
while ((s32)(GetEncoder.V2)<-Vbreak)
{
GetEncoder.rcnt2++;
CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
GetEncoder.V2 = CNT2_temp - CNT2_last;
}
GetEncoder.CNT2 = CNT2_temp;
}
///////////////////
void Get_Encoder_TWO(void)
{
s32 CNT3_temp,CNT3_last;
GetEncoder.cnt3 = TIM3 -> CNT;
CNT3_last = GetEncoder.CNT3;
CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
GetEncoder.V3 = CNT3_temp - CNT3_last;
while ((s32)(GetEncoder.V3)>Vbreak)
{
GetEncoder.rcnt3--;
CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
GetEncoder.V3 = CNT3_temp - CNT3_last;
}
while ((s32)(GetEncoder.V3)<-Vbreak)
{
GetEncoder.rcnt3++;
CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
GetEncoder.V3 = CNT3_temp - CNT3_last;
}
GetEncoder.CNT3 = CNT3_temp;
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于STM32簡(jiǎn)易電機(jī)伺服控制器.rar
(298.89 KB, 下載次數(shù): 283)
2017-8-23 21:54 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
cyw610
時(shí)間:
2018-1-27 16:55
這個(gè)控制源碼有實(shí)際應(yīng)用過嗎?
作者:
cyw610
時(shí)間:
2018-1-27 16:56
代碼實(shí)用過嗎?
作者:
Jason9090
時(shí)間:
2018-3-5 13:43
不錯(cuò)很好,棒
作者:
reigoo
時(shí)間:
2018-4-1 21:26
牛x,好用嗎
作者:
reigoo
時(shí)間:
2018-4-1 21:26
不錯(cuò)不錯(cuò)
作者:
reigoo
時(shí)間:
2018-4-1 21:54
正需要
作者:
luluwen99
時(shí)間:
2018-5-9 17:08
有人用過嗎???
作者:
一沙鷗H
時(shí)間:
2018-5-24 15:50
代碼用過嗎
作者:
835660130
時(shí)間:
2018-5-29 22:10
有電氣原理圖嗎
作者:
plainsailing
時(shí)間:
2018-10-17 16:42
謝謝分享~~~~
作者:
王梓鑫
時(shí)間:
2019-1-3 06:56
有電機(jī)和單片機(jī)的接線原理圖嗎?
作者:
百花叢中過
時(shí)間:
2019-4-23 21:00
不錯(cuò),剛好需要
作者:
hblinjingfeng12
時(shí)間:
2019-4-27 11:45
謝謝提供
作者:
Richie_zen
時(shí)間:
2019-6-19 12:10
謝謝樓主奉獻(xiàn)!
作者:
將軍0423
時(shí)間:
2019-6-25 17:46
有電路連接圖嗎
作者:
xinydz
時(shí)間:
2019-9-29 18:13
下載看看
作者:
563345228
時(shí)間:
2020-3-20 20:19
怎么接線啊
作者:
飛向藍(lán)天nie
時(shí)間:
2020-5-22 09:21
沒參考價(jià)值,什么說明都沒有,
作者:
fffa121212
時(shí)間:
2020-10-14 09:10
有人測(cè)試過有效嗎
作者:
fffa121212
時(shí)間:
2020-10-14 09:10
請(qǐng)問針對(duì)的是哪個(gè)型號(hào)的伺服啊
作者:
mick32
時(shí)間:
2022-4-5 05:48
No schematics ?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1