|
簡單電機(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簡易電機(jī)伺服控制器.rar
(298.89 KB, 下載次數(shù): 283)
2017-8-23 21:54 上傳
點(diǎn)擊文件名下載附件
|
|