stm32通过IO口模拟输出多路pwm

时间:2022-01-18 21:23:46

    这里主要用于控制舵机,使用TIM1模拟了5路50Hz的PWM信号,只调节占空比控制舵机角度。

最大能模拟多少路没有具体测试。

缺点:因为是定时器中断模拟(中断比较频繁),所以会影响main函数运行。

	LED p1('A',8);	//IO口初始化,这里就不介绍了,推挽输出
	LED p2('A',9);
	LED p3('A',10);
	LED p4('A',11);
	LED p5('A',4);
u16 count=0;
u16 pwm_count=1000;	//总计数 周期20ms,20us进次
u16 pwm1=25;
u16 pwm2=25;
u16 pwm3=25;
u16 pwm4=125;
u16 pwm5=125;
extern "C" void TIM4_IRQHandler(void)//1ms进来1次
{ 		    		  			    
	if(TIM4->SR&0X0001)//溢出中断
	{ 	
		count++;	
		if(count<pwm1)
		{
			PAout(8)=1;
			
		}
		else{
			PAout(8)=0;
		}
		//-------------------------------
		if(count<pwm2)
		{
			PAout(9)=1;
			
		}
		else{
			PAout(9)=0;
		}
		//------------------------------
		if(count<pwm3)
		{
			PAout(10)=1;
			
		}
		else{
			PAout(10)=0;
		}
		//--------------------------------
		if(count<pwm4)
		{
			PAout(11)=1;
			
		}
		else{
			PAout(11)=0;
		}
		//-------------------------------
		if(count<pwm5)
		{
			PAout(4)=1;
			
		}
		else{
			PAout(4)=0;
		}
		
		if(count==pwm_count)count=0;


	}				   
	TIM4->SR&=~(1<<0);//清除中断标志位 	    
}
//使能定时器4,使能中断.
void Timer1_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<2;	//TIM4时钟使能    
 	TIM4->ARR=arr;  	//设定计数器自动重装值  
	TIM4->PSC=psc;  	//预分频器71,得到1Mhz的计数时钟	
	TIM4->DIER|=1<<0;   //允许更新中断			  							    
	TIM4->CR1|=0x01;    //使能定时器2
  MY_NVIC_Init(1,1,TIM4_IRQn,2);//抢占1,子优先级1,组2(组2中优先级最高的)									 
}

Timer1_Init(19,71);    初始化就好,20us一次中断。

通过更改这些值控制舵机角度

stm32通过IO口模拟输出多路pwm

19,和总计数控制频率。