STM32步进电机加减速 电机的加减速为了,电机启动停止更加稳定,提高匀速速度。S曲线算法优化电机的运行。

电机的加减速为了,电机启动停止更加稳定,提高匀速速度。S曲线算法优化电机的运行。

整个过程就是,模仿S曲线设置电机的频率

程序采用,通过s_curve()函数映射一张小于1500个点的表, 输出一次pwm方波,中断一次,计数器step计数一次 ,TIM_SetAutoreload()重新设置arr频率。


S曲线函数,加速和减速同理,返回值是表的个数

[plain]  view plain  copy
  1. uint16_t _stepmotor_calc(uint16_t min, uint16_t max, float rate, float val[1500])  
  2. {  
  3.       uint16_t  i;  
  4.       float     Ainf_v;  
  5.       uint16_t  AInf_t;  
  6.       float     end_v;  
  7.       float     start_v;  
  8.       end_v=100000/min;  
  9.       start_v=100000/max;  
  10.         Ainf_v=(end_v-start_v)/2+start_v;  
  11.         AInf_t=sqrt(2*(Ainf_v-start_v)/rate);  
  12.         for(i=0;i  

代码实现:

电机的配置 :

[plain]  view plain  copy
  1. void RCC_Cfg(void)  
  2. {        
  3.        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    
  4.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);  
  5. }  
  6. void GPIO_Cfg_gpio_b(void)  
  7. {    
  8.     GPIO_InitTypeDef GPIO_InitStructure;             
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  10.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;  
  11.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;  
  12.     GPIO_Init(GPIOB,&GPIO_InitStructure);   
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;  
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  16.     GPIO_Init(GPIOA, &GPIO_InitStructure);  
  17.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_10|GPIO_Pin_11;         
  18.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  19.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  20.     GPIO_Init(GPIOB, &GPIO_InitStructure);  
  21.     GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);  //OE使能  
  22.     GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);  //细分1  
  23.     GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET);    //细分2  
  24.     GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_RESET); //ATT1衰减  
  25.     GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET);   //ATT2衰减  
  26.     GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);  //CW方向      
  27. }  
  28. void PWM_Cfg(void)  
  29. {  
  30.     TIM_OCInitTypeDef TIM_OCInitStructure;  
  31.     NVIC_InitTypeDef NVIC_InitStructure;  
  32.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  33.     TIM_OCStructInit(&TIM_OCInitStructure);  
  34.     TIM_DeInit(TIM3);        
  35.     TIM_InternalClockConfig(TIM3);      
  36.     TIM_TimeBaseStructure.TIM_Period = 65535;      //arr      
  37.     TIM_TimeBaseStructure.TIM_Prescaler = 200;    // psc  //Tclk/((arr+1)*(psc+1))Tclk;                          
  38.     TIM_TimeBaseStructure.TIM_ClockDivision =0;// TIM_CKD_DIV1  
  39.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  40.     TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);  
  41.     TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);    
  42.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
  43.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  44.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  45.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  46.     NVIC_Init(&NVIC_InitStructure);   
  47.     TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM1;   
  48.     TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;   
  49.     TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;      
  50.     TIM_OCInitStructure.TIM_Pulse = 0;  
  51.     TIM_OC4Init(TIM3, &TIM_OCInitStructure);  
  52.     TIM_CtrlPWMOutputs(TIM3,ENABLE);  
  53.           
  54. }  


主函数部分,整个运行的图像是个梯形,先加速在匀速在减速停止
[plain]  view plain  copy
  1. #include "stm32f10x.h"  
  2. #include "math.h"  
  3. #include "pwm.h"  
  4.   
  5. #define _ACC_DEC_MAX_COUNT 1500  
  6. #define _STEP_INT 8000  
  7.   
  8. #define mortor_cw(x) x ? GPIO_SetBits(GPIOB,GPIO_Pin_0):GPIO_ResetBits(GPIOB,GPIO_Pin_0)  
  9. void stm32_init(void);  
  10. void delay_ms(u32 i);  
  11. void once_pwm(void);  
  12.   
  13. int acc_i = 0;  
  14. int dec_i = 0;  
  15. int cw_buf=0;  
  16. uint16_t acc_count;  
  17. uint16_t dec_count;  
  18.   
  19. typedef struct  
  20. {  
  21.     int StepCount;  
  22.     float acc_val[_ACC_DEC_MAX_COUNT];  
  23.     float dec_val[_ACC_DEC_MAX_COUNT];  
  24. }str_mot;  
  25.   
  26. str_mot motor_1;  
  27.   
  28. void Delay(u32 nCount)  
  29. {  
  30.   do{  
  31.     }  
  32.   while(nCount--);  
  33. }  
  34.   
  35. int main()  
  36. {  
  37.       int i = 0;  
  38.       float temp = 0;  
  39.       stm32_init();  
  40.        
  41.       RCC_Cfg();     
  42.       GPIO_Cfg_gpio_b();      
  43.       motor_1.StepCount=0;  
  44.       acc_count=0;  
  45.       dec_count=0;        
  46.       PWM_Cfg();  
  47.       TIM_SetCompare4(TIM3,(20/2));  
  48.       
  49.       acc_count = _stepmotor_calc(60,250,0.09,motor_1.acc_val);  
  50.       dec_count = _stepmotor_calc(60,150,0.005,motor_1.dec_val);  
  51.       
  52.       for(i = 0;i= (_STEP_INT-dec_count))  
  53.         {   
  54.             TIM_SetAutoreload(TIM3,motor_1.dec_val[(dec_i)]);  
  55.             TIM_SetCompare4(TIM3,(motor_1.dec_val[(dec_i)]/2));   
  56.             dec_i++;  
  57.         }  
  58.     }  
  59. }  

猜你喜欢

转载自blog.csdn.net/yilongdashi/article/details/80467482