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

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

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

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

      从图中可得,除必须的使能、刹车信号外,对运动控制起主要作用的是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波占空比,最终改变电机转速。至此,本部分内容已经结束,谢谢阅读。

你可能感兴趣的:(STM32F407通过定时器输出多路PWM波控制电机做正反转的正弦运动(二))