新手一枚,求助

[复制链接]
191|5
 楼主 | 2019-6-5 15:43 | 显示全部楼层 |阅读模式
我现在用STM32+L297+L298控制两项步进电机,现在输出PWM波没有问题,可是电机转动一顿一顿的不流畅,而且我调节频率的时候感觉有问题,求各位大神帮忙看一下哪里有问题了
  1. #include "MOTOR.h"

  2. /*

  3.       两个电机管脚分配
  4.                         step3       step2   
  5.                         PD13        PC6
  6.                         dirction3   dirction2
  7.                         PD15        PC7
  8.                         en3         en2
  9.                         PD14        PC8
  10.                        
  11. */

  12. //      en3         en2
  13. //                        PD14        PC8
  14. //   dirction3      dirction2
  15. //                  PD15        PC7
  16.         void MOTOR_En_Dir(void)
  17.                  {
  18.          GPIO_InitTypeDef  GPIO_InitStructure;
  19.                           //3#使能端设置
  20.                                  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  21.                        
  22.                                  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);         //开启gpioD时钟
  23.                                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;                                       //gpiod.14
  24.                                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    //推挽输出
  25.                                  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //IO口速度为50MHz
  26.                                  GPIO_Init(GPIOD, &GPIO_InitStructure);                                                 //初始化
  27.                     //3#方向设置
  28.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);         //开启GPIOD时钟
  29.                                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                                       //GPIOD.15
  30.                                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    //推挽输出
  31.                                  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //IO口速度为50MHz
  32.                                  GPIO_Init(GPIOD, &GPIO_InitStructure);                                                 //初始化
  33.                           //3#输出比较设置   TIM4_CH2
  34.                                         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);   //开启GPIOD时钟
  35.                                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;              //GPIOD.13
  36.                                         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
  37.                                         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //IO口速度为50MHz
  38.                                         GPIO_Init(GPIOD, &GPIO_InitStructure);                  //初始化
  39.                           //2#使能设置
  40.                            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //开启GPIOC时钟
  41.                                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                       //GPIOC.8
  42.                                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    //推挽输出
  43.                                  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //IO口速度为50MHz
  44.                                  GPIO_Init(GPIOC, &GPIO_InitStructure);                                                 //初始化
  45.                           //2#方向设置
  46.                            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);         //开启GPIOC时钟
  47.                                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                       //GPIOC.7
  48.                                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    //推挽输出
  49.                                  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //IO口速度为50MHz
  50.                                  GPIO_Init(GPIOC, &GPIO_InitStructure);                                                 //初始化
  51.                                 //2#输出比较设置   TIM4_CH2
  52.                                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);   //开启GPIOC时钟
  53.                                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;               //GPIOC.6
  54.                                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
  55.                                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //IO口速度为50MHz
  56.                                 GPIO_Init(GPIOC, &GPIO_InitStructure);                  //初始化
  57.                           
  58.                                
  59. //                                GPIO_ResetBits(GPIOD,GPIO_Pin_14);
  60. //                                GPIO_ResetBits(GPIOC,GPIO_Pin_8);
  61.                          GPIO_SetBits(GPIOC,GPIO_Pin_7);      
  62.                          GPIO_SetBits(GPIOD,GPIO_Pin_15);
  63.                          GPIO_SetBits(GPIOD,GPIO_Pin_14);      
  64.                          GPIO_SetBits(GPIOC,GPIO_Pin_8);
  65.                  }
  66. ///*
  67. // * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  68. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  69. // * 另外三个成员是通用定时器和高级定时器才有.
  70. // *-----------------------------------------------------------------------------
  71. // *typedef struct
  72. // *{ TIM_Prescaler            都有
  73. // *        TIM_CounterMode                             TIMx,x[6,7]没有,其他都有
  74. // *  TIM_Period               都有
  75. // *  TIM_ClockDivision        TIMx,x[6,7]没有,其他都有
  76. // *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有
  77. // *}TIM_TimeBaseInitTypeDef;
  78. // *-----------------------------------------------------------------------------
  79. // */

  80. /* ----------------   PWM信号 周期和占空比的计算--------------- */
  81. // ARR :自动重装载寄存器的值
  82. // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
  83. // PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
  84. // 占空比P=CCR/(ARR+1)
  85. //    step1      step2   
  86. //                PD13       PC6
  87. //    TIM4_CH2   TIM3_CH1
  88.                 void MOTOR2_Step(u16 arr,u16 psc)
  89.                 {
  90.                
  91.                         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  92.                         TIM_OCInitTypeDef  TIM_OCInitStructure;
  93.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  94.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  // 开启定时器时钟,即内部时钟CK_INT=72M
  95.   GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 , ENABLE);
  96. /*--------------------时基结构体初始化-------------------------*/
  97.        
  98.   
  99.        
  100.         TIM_TimeBaseStructure.TIM_Period=arr;                           // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  101.         TIM_TimeBaseStructure.TIM_Prescaler= psc;                              // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  102.         TIM_TimeBaseStructure.TIM_ClockDivision=0;                      // 时钟分频因子 ,配置死区时间时需要用到       
  103.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        // 计数器计数模式,设置为向上计数       
  104.         TIM_TimeBaseStructure.TIM_RepetitionCounter=0;                  // 重复计数器的值,没用到不用管
  105.         TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure);                // 初始化定时器

  106.         /*--------------------输出比较结构体初始化-------------------*/       

  107.        
  108.        
  109.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             // 配置为PWM模式1
  110.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        // 输出使能
  111.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            // 输出通道电平极性配置       
  112.         TIM_OCInitStructure.TIM_Pulse = 2;                                  // 输出比较通道 1
  113.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  114.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
  115.         TIM_Cmd(TIM3, ENABLE);// 使能计数器

  116.                 }
  117.                
  118. void MOTOR3_Step(u16 arrc,u16 pscc)
  119.                 {
  120.                 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure3;
  121.           TIM_OCInitTypeDef  TIM_OCInitStructure3;
  122.                        
  123.   // 开启定时器时钟,即内部时钟CK_INT=72M
  124.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
  125.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  126.                 GPIO_PinRemapConfig(GPIO_Remap_TIM4 , ENABLE);  
  127. /*--------------------时基结构体初始化-------------------------*/
  128.         //
  129.        
  130.   
  131.                        
  132.         TIM_TimeBaseStructure3.TIM_Period = arrc;          // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  133.                
  134.         TIM_TimeBaseStructure3.TIM_Prescaler=pscc ;                // 驱动CNT计数器的时钟 = Fck_int/(psc+1)       
  135.                        
  136.         TIM_TimeBaseStructure3.TIM_ClockDivision=2;        // 时钟分频因子 ,配置死区时间时需要用到       
  137.                        
  138.         TIM_TimeBaseStructure3.TIM_CounterMode=TIM_CounterMode_Up;        // 计数器计数模式,设置为向上计数       
  139.        
  140.         TIM_TimeBaseStructure3.TIM_RepetitionCounter=0;        // 重复计数器的值,没用到不用管
  141.        
  142.         TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure3);  // 初始化定时器

  143.         /*--------------------输出比较结构体初始化-------------------*/       
  144.         TIM_OCInitStructure3.TIM_OCMode = TIM_OCMode_PWM1;             // 配置为PWM模式1
  145.         TIM_OCInitStructure3.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
  146.         TIM_OCInitStructure3.TIM_OCPolarity = TIM_OCPolarity_High;           // 输出通道电平极性配置       
  147.         TIM_OCInitStructure3.TIM_Pulse = 5;                            // 输出比较通道 2
  148.         TIM_OC2Init(TIM4, &TIM_OCInitStructure3);
  149.         TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
  150.         TIM_Cmd(TIM4, ENABLE);                                         // 使能计数器
  151. }

  152.                 void MOTOR_Init(void)
  153.                 {
  154.                  //

  155.                        
  156.                         MOTOR_En_Dir();
  157.                         MOTOR2_Step(8999,799);        //PWM频率=72000000/(9000*8)  =1Khz
  158.                                                 //PWM频率=72000000/(9000*80) =100hz
  159.                                           //PWM频率=72000000/(9000*800)=10hz
  160.                          
  161.                         MOTOR3_Step(8999,799);        //PWM频率=72000000/(9000*8)  =1Khz
  162.                                                 //PWM频率=72000000/(9000*80) =100hz
  163.                                           //PWM频率=72000000/(9000*800)=10hz
  164.                        
  165.                 }
  166.                  
复制代码


使用特权

评论回复
 楼主 | 2019-6-5 16:35 | 显示全部楼层
已经解决,占空比问题

使用特权

评论回复

评论

dirtwillfly 2019-6-5 22:02 回复TA
能者自答 
 楼主 | 2019-6-5 16:49 | 显示全部楼层
TIM_TimeBaseStructure3.TIM_ClockDivision=2;        // 时钟分频因子 ,配置死区时间时需要用到 改成0
TIM_OCInitStructure3.TIM_Pulse = 5;改成arr的一半左右     即可

使用特权

评论回复

评论

dirtwillfly 2019-6-5 22:02 回复TA
感谢分享 
 楼主 | 2019-6-9 12:50 | 显示全部楼层
还有一个我不理解的地方,pwm也可以改变评率控制电机转速,为什么硬石的视频里要用输出比较呢?

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

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