STM32F407通过定时器输出多路PWM波控制电机做正反转的正弦运动(二)
程序员文章站
2024-02-22 11:54:28
...
承接上一篇,上一篇主要说了我的思路,还有正弦速度函数、系统定时器函数,本篇主要是改变定时器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波占空比,最终改变电机转速。至此,本部分内容已经结束,谢谢阅读。