[资料干货] 基于STM32单片机设计的驱动步进电机-定时器输出正弦波

[复制链接]
1752|7
 楼主| 感动 发表于 2019-9-15 12:01 | 显示全部楼层 |阅读模式
本帖最后由 感动 于 2019-9-15 12:04 编辑

前面的**介绍了单片机控制步进电机四相四拍、四相八拍的方式。用的是持续电平驱动,这种驱动方式电机的噪音大,震动明显,下面介绍正弦波驱动方式,这种方式能很好的解决噪音和震动问题。
首先需要准备下stm32的正弦波PWM表,可以用EXCEL生成,文件在附件中。
配置单片机定时器的PWM输出。
  1. void TIM_Config(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  6.         NVIC_InitTypeDef NVIC_InitStructure;
  7.         
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  10.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  12.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.         
  15.         TIM_TimeBaseStructure.TIM_Period=512;        
  16.         TIM_TimeBaseStructure.TIM_Prescaler= 7;        
  17.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  18.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  19.         TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        
  20.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  21.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  22.         TIM_OCInitStructure.TIM_Pulse=512;                 
  23.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  24.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  25.         
  26.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  27.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  28.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  29.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  30.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  31.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  32.         TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  33.         TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
  34.         
  35.         TIM_ARRPreloadConfig(TIM1, ENABLE);        
  36.         TIM_Cmd(TIM1, ENABLE);
  37.         
  38.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  39.   
  40.   NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  41.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  42.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  43.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  44.   NVIC_Init(&NVIC_InitStructure);                                                                                                
  45.         
  46.         TIM_CtrlPWMOutputs(TIM1,ENABLE);
  47.         TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                                                                                
  48. }
配置定时器的数据更新中断,在中断里更新CCR的值改变占空比。
  1. void TIM1_UP_IRQHandler(void)
  2. {        
  3.         if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)        
  4.          {               
  5.                 pwm1_index++;if(pwm1_index>36)pwm1_index=0;
  6.                 pwm2_index++;if(pwm2_index>36)pwm2_index=0;
  7.                 pwm3_index++;if(pwm3_index>36)pwm3_index=0;
  8.                 pwm4_index++;if(pwm4_index>36)pwm4_index=0;
  9.                 TIM1->CCR1 = indexWave[pwm1_index];        
  10.                 TIM1->CCR2 = indexWave[pwm2_index];        
  11.                 TIM1->CCR3 = indexWave[pwm3_index];        
  12.                 TIM1->CCR4 = indexWave[pwm4_index];        
  13.                 TIM_ClearITPendingBit (TIM1, TIM_IT_Update);        
  14.         }
至此可以看到定时器输出的符合正弦波规律的PWM波。
程序在这里
可以对比下用正弦波代替持续电平的效果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

值得点赞,楼主好样的。  发表于 2019-9-16 10:26
xyz549040622 发表于 2019-9-15 15:36 来自手机 | 显示全部楼层
支持下。
NickyGrout 发表于 2019-9-15 21:27 | 显示全部楼层
这种是属于恒压驱动吧
R2D2 发表于 2019-9-15 21:43 | 显示全部楼层
NickyGrout 发表于 2019-9-15 21:27
这种是属于恒压驱动吧

玩具级别的步进电机都是恒压。
lvface123654 发表于 2019-9-16 16:37 | 显示全部楼层
其实重点是驱动表,你是做的怎么样的加减速
e_007 发表于 2019-11-11 11:50 | 显示全部楼层
R2D2 发表于 2019-9-15 21:43
玩具级别的步进电机都是恒压。

人家都说了,是正玄波。。。
liubinghui 发表于 2022-11-5 15:07 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:关注我的博客https://blog.csdn.net/gd1984812 淘宝店 https://shop570248211.taobao.

35

主题

57

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部