STM32控制编码器电机实现【速度闭环控制】与【位置闭环控制】_第1页
STM32控制编码器电机实现【速度闭环控制】与【位置闭环控制】_第2页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 STM32控制编码器电机实现【速度闭环控制】与【位置闭环控制】、硬件及接线说明本实验所基于的硬件分别为:STM32F103C8T6 主控板TB6612FNG 直流电机驱动模块6线正交编码器电机(带AB相)其中硬件接线为:PWMA PA8AIN1 PB14AIN2 PB15STBY 5V编码器A相 PA1编码器B相 PA0STM32定时器资源分配:定时器1(TIM1):产PWM波,作为TB6612的输,控制电机进调速;定时器2(TIM2):读取编码器的波形;定时器3(TIM3):产周期为10ms的定时器中断,为控制系统提供稳定的时间基准。【说明】上述硬件平台和接线仅给读者提供参考,更换主控或接

2、线式,请对例程序进微调。本对于编码器的作原理不加赘述,对于其原理请读者查阅相关资料。、速度闭环控制程序逻辑【说明】下述程序中 control.c 最为重要,包含了速度闭环控制器的详细代码。其他程序模块供读者初始化参考。main.c (主函数)12u8 flag_Stop=1; /停标志位/编码器的脉冲计数/电机PWM变量34567/=延时初始化8LED_Init();/=初始化与LED 连接的硬件接/=初始化串19101112131415161718/初始化控制电机所需的IO/初始化pwm输出/初始化计数器(定时器)TIM3_Int_Init (99,7199); /10ms次中断printf

3、(Encoder:%d rn,Encoder);moto.c (电机初始化相关函数) 12void MOTO_Init(void)/初始化控制电机所需的IO3GPIO_InitTypeDef GPIO_InitStruct ;4RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/PORTB12 13 14 15推挽输出56789101112131415161718192021222324252627282930313233343536373839404142434445void pwm_Init(u16 arr,u16 psc) /初始化p

4、wm输出引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); /使能定时器1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /使能GPIOA的时钟TIM_TimeBaseInitStruct .TIM_Period = arr;TIM_TimeBaseInitStruct .TIM_Prescaler = psc;TIM_TimeBaseInitStruct .TIM_CounterMode = TIM_CounterMode_Up ; /TIM向上计数模式TIM_OCInitS

5、truct.TIM_OCMode = TIM_OCMode_PWM2 ;/选择PWM2模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable ; /较输出使能TIM_OCInitStruct.TIM_Pulse = 0;/设置待装捕获较寄存器的脉冲值TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM1,&TIM_OCInitStruct);/初始化输出较参数TIM_OC1PreloadConfig (TIM1,TIM_OCPreload_Ena

6、ble ); /CH1使能预装载寄存器TIM_CtrlPWMOutputs(TIM1,ENABLE);TIM_ARRPreloadConfig(TIM1, ENABLE);TIM_Cmd(TIM1,ENABLE);/级定时器输出必须设置这句/使能TIM1在ARR上的预装载寄存器/使能定时器1encoder.c (编码器初始化函数) 12/*函数功能:把TIM2初始化为编码器接模式参数:34返回 值:56void Encoder_Init_TIM2 (void)78910111213141516171819202122232425262728293031323334353637383940414

7、2434445464748GPIO_InitTypeDef GPIO_InitStructure ;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/使能定时器2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/使 能PA端时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; /端配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; /浮空输/根据设定参数初始化

8、GPIOBTIM_TimeBaseStructure .TIM_Period = ENCODER_TIM_PERIOD-1; /设定计数器动重装值TIM_TimeBaseStructure .TIM_ClockDivision = TIM_CKD_DIV1;/选择时钟分频:不分频TIM_TimeBaseStructure .TIM_CounterMode = TIM_CounterMode_CenterAligned1 ;TIM向上计数TIM_TimeBaseInit (TIM2, &TIM_TimeBaseStructure );TIM_EncoderInterfaceConfig (TIM

9、2, TIM_EncoderMode_TI12 , TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);/使编码器模式3TIM_ICStructInit(&TIM_ICInitStructure ); /把TIM_ICInitStruct 中的每个参数按缺省值填TIM_ICInitStructure .TIM_ICFilter = 10; /设置滤波器长度TIM_ICInit(TIM2, &TIM_ICInitStructure ); /根据 TIM_ICInitStruct 的参数初始化外设TIMxTIM_ClearFlag (TIM2, TIM_FL

10、AG_Update );/清除TIM的更新标志位TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);/使能定时器中断TIM_SetCounter (TIM2,0);/设 置TIMx 计数器寄存器值TIM_Cmd(TIM2, ENABLE); /使能定时器2/中断处理函数为空,清除中断标志位后结束中断void TIM2_IRQHandler (void)if(TIM_GetFlagStatus (TIM2,TIM_FLAG_Update )=SET)/溢出中断TIM_ClearITPendingBit (TIM2,TIM_IT_Update ); /清除中断标志

11、位/*函数功能:单位时间读取编码器计数49 参数:定时器返回 值:速度值50*/515253int Encoder_TIM;54switch(TIMX)55565758596061626364 timer.c (定时器中断初始化函数)123456789101112131415161718192021222324252627TIM_TimeBaseInitStruct .TIM_Period = arr; /重装载值TIM_TimeBaseInitStruct .TIM_Prescaler = psc; /预分频系数TIM_TimeBaseInitStruct .TIM_ClockDivisio

12、n =0; /时钟分割TIM_TimeBaseInitStruct .TIM_CounterMode = TIM_CounterMode_Up ; /TIM向上计数模式TIM_TimeBaseInit (TIM3,&TIM_TimeBaseInitStruct );TIM_ITConfig(TIM3,TIM_IT_Update ,ENABLE); /使能定时器中断NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; /使能外部中断通道NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; /使能外部中断通道NVIC_Init

13、Struct.NVIC_IRQChannelPreemptionPriority = 1; /抢占优先级1NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; /响应优先级3NVIC_Init(&NVIC_InitStruct);TIM_Cmd(TIM3,ENABLE); /使能定时器3control.c (核控制程序,此模块程序可供读者详细阅读)12#include control.hint Target_velocity=50; /设定速度控制的标速度为50个脉冲每10ms34int TIM3_IRQHandler (void)5678TIM_Cl

14、earITPendingBit (TIM3,TIM_IT_Update );/=清除定时器3中断标志位/取定时器2计数器的值/LED闪烁910111213141516moto=Incremental_PI(Encoder,Target_velocity); /=速度PID控制器Xianfu_Pwm();Set_Pwm(moto);return 0;17 /*函数功能:赋值给PWM寄存器参数:PWM返回 值:1819202122232425262728void Set_Pwm(int moto)/赋值给PWM寄存器else返回 值:30 30313233343536373839int Ampli

15、tude=7100; /=PWM满幅是7200 限制在7100if(motoAmplitude) moto = Amplitude;4344454647484950515253545556e(k)代表本次偏差e(k-1)代表上次的偏差 以此类推pwm代表增量输出在我们的速度控制闭环系统,只使PI控制57 pwm+=Kpe(k)-e(k-1)+Ki*e(k)58 */59 int Incremental_PI (int Encoder,int Target)60616263646566676869float Kp=20,Ki=30;Pwm+=Kp*(Bias-Last_bias)+Ki*Bias

16、; /增量式PI控制器/保存上次偏差/增量输出三、位置闭环控制程序逻辑【说明】下述程序中 control.c 最为重要,包含了速度闭环控制器的详细代码。其他程序模块供读者初始化参考。main.c 12u8 flag_Stop=1; /停标志位int Encoder,Position=10000;/编码器的脉冲计数3/电机PWM变量4567/=延时初始化8/=初始化与LED 连接的硬件接/=初始化串19101112131415161718/初始化控制电机所需的IO/初始化pwm输出/初始化计数器(定时器)TIM3_Int_Init (99,7199); /10ms次中断moto.c 123GPI

17、O_InitTypeDef GPIO_InitStruct ;4RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/PORTB12 13 14 15推挽输出GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStr

18、uct);5678910111213141516171819202122232425262728293031323334353637383940414243444546void pwm_Init(u16 arr,u16 psc) /初始化pwm输出引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); /使能定时器1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /使能GPIOA的时钟TIM_TimeBaseInitStruct .TIM_Period = arr;TIM_Time

19、BaseInitStruct .TIM_CounterMode = TIM_CounterMode_Up ; /TIM向上计数模式TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2 ;/选择PWM2模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable ; /较输出使能TIM_OCInitStruct.TIM_Pulse = 0;/设置待装捕获较寄存器的脉冲值TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(T

20、IM1,&TIM_OCInitStruct);/初始化输出较参数TIM_OC1PreloadConfig (TIM1,TIM_OCPreload_Enable ); /CH1使能预装载寄存器TIM_CtrlPWMOutputs(TIM1,ENABLE);TIM_ARRPreloadConfig(TIM1, ENABLE);TIM_Cmd(TIM1,ENABLE);/级定时器输出必须设置这句/使能TIM1在ARR上的预装载寄存器/使能定时器1encoder.c 12void Encoder_Init_TIM2 (void)345GPIO_InitTypeDef GPIO_InitStructur

21、e ;6RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/使能定时器2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/使 能PA端时钟789GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; /端配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; /浮空输10111213141516171819202122232425262728293031323334353

22、63738394041/根据设定参数初始化GPIOBTIM_TimeBaseStructure .TIM_Period = ENCODER_TIM_PERIOD-1; /设定计数器动重装值TIM_TimeBaseStructure .TIM_ClockDivision = TIM_CKD_DIV1;/选择时钟分频:不分频TIM_TimeBaseStructure .TIM_CounterMode = TIM_CounterMode_CenterAligned1 ;TIM向上计数TIM_TimeBaseInit (TIM2, &TIM_TimeBaseStructure );TIM_Encode

23、rInterfaceConfig (TIM2, TIM_EncoderMode_TI12 , TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);/使编码器模式3TIM_ICStructInit(&TIM_ICInitStructure ); /把TIM_ICInitStruct 中的每个参数按缺省值填TIM_ICInitStructure .TIM_ICFilter = 10; /设置滤波器长度TIM_ICInit(TIM2, &TIM_ICInitStructure );/根据 TIM_ICInitStruct 的参数初始化外设TIMxTIM_Cle

24、arFlag (TIM2, TIM_FLAG_Update );/清除TIM的更新标志位TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);/使能定时器中断TIM_SetCounter (TIM2,10000);/设 置TIMx 计数器寄存器值TIM_Cmd(TIM2, ENABLE); /使能定时器2/中断处理函数为空,清除中断标志位后结束中断void TIM2_IRQHandler (void)if(TIM_GetFlagStatus (TIM2,TIM_FLAG_Update )=SET)/溢出中断TIM_ClearITPendingBit (TIM2,

25、TIM_IT_Update );/清除中断标志位42 /*4344454647484950515253545556575859*/int Encoder_TIM;switch(TIMX)case 2:Encoder_TIM=(short)TIM2-CNT; break;case 3:Encoder_TIM=(short)TIM3-CNT; break;case 4:Encoder_TIM=(short)TIM4-CNT; break;default: Encoder_TIM=0;timer.c 12345678910111213141516171819202122232425262728TIM

26、_TimeBaseInitStruct .TIM_Period = arr; /重装载值TIM_TimeBaseInitStruct .TIM_Prescaler = psc; /预分频系数TIM_TimeBaseInitStruct .TIM_ClockDivision =0; /时钟分割TIM_TimeBaseInitStruct .TIM_CounterMode = TIM_CounterMode_Up ; /TIM向上计数模式TIM_TimeBaseInit (TIM3,&TIM_TimeBaseInitStruct );TIM_ITConfig(TIM3,TIM_IT_Update

27、,ENABLE); /使能定时器中断NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; /使能外部中断通道NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; /使能外部中断通道NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; /抢占优先级1NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; /响应优先级3NVIC_Init(&NVIC_InitStruct);TIM_Cmd(TIM3,ENABLE); /使能定时器3control.c (核控制程序,此模块程序可供读者详细阅读)12#include cont

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论