欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-22 11:54:28
...

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

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

STM32F407通过定时器输出多路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减速比的减速箱,到减速机输出轴的转速为5STM32F407通过定时器输出多路PWM波控制电机做正反转的正弦运动(二)rad/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波占空比,最终改变电机转速。至此,本部分内容已经结束,谢谢阅读。

相关标签: stm32f407 pwm tim