STM32F407通过定时器输出多路PWM波控制电机做正反转的正弦运动2

承接上一篇,上一篇主要说了我的思路,还有正弦速度函数、系统定时器函数,本篇主要是改变定时器PWM波占空比和电机正反转。电机驱动器的接线图和驱动器控制信号输入端口如下所示,

      从图中可得,除必须的使能、刹车信号外,对运动控制起主要作用的是SV和FR端口,SV端口能够输入模拟信号或者PWM波信号作控制信号,选择PWM波作输入信号的原因是stm32的定时器资源丰富,有充足的输出比较通道作PWM波用,FR端口用来控制电机正反转,高低电平作控制信号。     

void gpio_init_fr(void)//正反转信号
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
 
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
          GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOC
          GPIO_SetBits(GPIOF,GPIO_Pin_13);
    GPIO_SetBits(GPIOF,GPIO_Pin_14);
    GPIO_SetBits(GPIOF,GPIO_Pin_15);}
void motor_open_excute(float velocity_now_motor[3],int arr,float frequence[3],float amplitude[3])
{
        
        float voltage[3]={0};
        int ccr[3]={0};
        
        if(velocity_now_motor[0]<0)        //正反转
                GPIO_ResetBits(GPIOF,GPIO_Pin_13);//M1_FR=!M1_FR;
        else                                                    
                GPIO_SetBits(GPIOF,GPIO_Pin_13);//M1_FR=!M1_FR;
        
        if(velocity_now_motor[1]<0)
                GPIO_ResetBits(GPIOF,GPIO_Pin_14);//M2_FR=!M2_FR;
        else
                GPIO_SetBits(GPIOF,GPIO_Pin_14);//M2_FR=!M2_FR;
        
        if(velocity_now_motor[2]<0)
                GPIO_ResetBits(GPIOF,GPIO_Pin_15);//M3_FR=!M3_FR;
        else
                GPIO_SetBits(GPIOF,GPIO_Pin_15);//M3_FR=!M3_FR;                
        for(int i=0;i<3;i++)
        {
            velocity_now_motor[i]=abs__(velocity_now_motor[i]);
            voltage[i]=velocity_now_motor[i]*arr/(5*pi);        //reduction ratio
            ccr[i]=(int)voltage[i];
            ccr[i]=limit_int_l_h(ccr[i],0,500);
        }        
        TIM_SetCompare1(TIM3,ccr[0]);//设置定时器比较值
        TIM_SetCompare2(TIM3,ccr[1]);
        TIM_SetCompare3(TIM3,ccr[2]);
}
int limit_int_l_h(int Num,int min,int max)//防止超出极值
{
        if(Num<=min)
            return min;
        else if(Num>=max)
            return max;
        else
            return Num;
}    
float abs__(float num)//取绝对值
{
    if(num>=0) return num;
      else if(num<0) return -1*num;
      else
            return 0.0;
}
       voltage[i]=velocity_now_motor[i]*arr/(5*pi),我使用的直流电机最大转速为6000rpm,并带有一个40减速比的减速箱,到减速机输出轴的转速为5rad/s,   velocity_now_motor[i]/(5*pi)*arr得到比较值ccr。

       主函数如下,

int main(void)

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);  //初始化延时函数
    LED_Init();
 
    gpio_init_fr();        //使能电机方向控制端口
    gpio_init_br_en();//使能电机刹车控制端口
    
    CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);//CAN初始化函数,波特率500Kbps
    
    
     TIM3_PWM_Init(500-1,84-1);    //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.  
    TIM4_Int_Init(50-1,8400-1);    //定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数50次为5ms
   while()
          {}
}  

定时器TIM3的预装载值arr为500,ccr/arr为PWM波占空比,最终改变电机转速。至此,本部分内容已经结束,谢谢阅读。
--------------------- 
作者:IL_LBJ 
来源:CSDN 
原文:https://blog.csdn.net/il_lbj/article/details/80758444 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]中的代码是一个STM32F407的主函数,其中使用了定时器2来实现PWM功能。在该代码中,通过调用TIM14_PWM_Init函数来初始化定时器2的PWM功能,设置了计数频率为1MHz,重装载值为500,从而实现了2kHz的PWM频率。在主循环中,通过修改TIM_SetCompare1函数的比较值来改变PWM的占空比,从而控制LED的亮度。 引用\[2\]中提到,除了必须的使能和刹车信号外,运动控制中的主要作用是SV和FR端口。SV端口可以输入模拟信号或者PWM信号作为控制信号,而FR端口用来控制电机反转。 综上所述,STM32F407定时器2可以用来实现PWM功能,通过修改比较值来控制占空比,从而控制LED的亮度或者控制电机运动。 #### 引用[.reference_title] - *1* *2* [STM32F407通过定时器输出多路PWM控制电机反转正弦运动2](https://blog.csdn.net/duobaohongtu3/article/details/94640345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32F407--定时器输出PWM](https://blog.csdn.net/weixin_42215853/article/details/110194718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值