完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
承接上一篇,上一篇主要说了我的思路,还有正弦速度函数、系统定时器函数,本篇主要是改变定时器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=abs__(velocity_now_motor); voltage=velocity_now_motor*arr/(5*pi); //reduction ratio ccr=(int)voltage; ccr=limit_int_l_h(ccr,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=velocity_now_motor*arr/(5*pi),我使用的直流电机最大转速为6000rpm,并带有一个40减速比的减速箱,到减速机输出轴的转速为5rad/s, velocity_now_motor/(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波占空比,最终改变电机转速。至此,本部分内容已经结束,谢谢阅读。 |
|
|
|
只有小组成员才能发言,加入小组>>
2454 浏览 0 评论
9268 浏览 4 评论
36948 浏览 19 评论
5054 浏览 0 评论
24948 浏览 34 评论
1600浏览 2评论
1847浏览 1评论
2295浏览 1评论
1630浏览 0评论
608浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 20:24 , Processed in 1.437351 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号