STM32利用TIM3产生一个1--100Hz可调频率
Posted xingboy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32利用TIM3产生一个1--100Hz可调频率相关的知识,希望对你有一定的参考价值。
目标:利用TIM3结合普通GPIO实现一个1--100HZ的可控频率,误差在0.5HZ以内
1.在这里我是使用STM32CuBeMx建立的工程,工程建立过程就不细说了,这里主要讲解实现部分。
我使用的是STM32F07系列外部晶振为8MHz,CuBeMx建立的工程有一个好处就是可以减少很多初始化的步骤,加快开发速度。
2.先对定时器进行初始化,定时一个50us的定时器,我这里定时器初始频率为48MHz
htim3.Init.Prescaler =50-1;//定时0.05ms=50us ,预分频
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 47;//设定计数值
最终定时器频率计算为: 48MHz/(GENERAL_TIMx_PRESCALER+1)/GENERAL_TIMx_PERIOD
3.这里的频率控制参数0-100主要由上位机通过串口传输,关于上位机与串口的知识这里不细讲,
因为上位机把数据字符串拆分成一个个的十六进制发送下来,这里只放接收到数据后的处理方法;
case 0x10 : //上位机接收数据处理,0x01数据头
if(Uart1_Rxbuf.Data[1] == 0x30) //对0进行处理
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); //ltc1624使能
time_flag1=0; tim_no=0;
}
else
{ if(Uart1_Rxbuf.Data[2] == 0x0a)
{
fre= (uint32_t )Uart1_Rxbuf.Data[1]-0x30; //接收个位数数据处理
else if (Uart1_Rxbuf.Data[3] == 0x0a)
fre= ((Uart1_Rxbuf.Data[1]-0x30)*10) + (Uart1_Rxbuf.Data[2]-0x30); //接收十位数数据处理
else if (Uart1_Rxbuf.Data[4] == 0x0a)
fre= ((Uart1_Rxbuf.Data[1]-0x30)*100) + ((Uart1_Rxbuf.Data[2]-0x30)*10) + (Uart1_Rxbuf.Data[2]-0x30);//接收百位数数据处理
else if (Uart1_Rxbuf.Data[5] == 0x0a)
fre= 1000; //1000Hz
fr=10000/fre; //上位机控制参数跟定时器定时计数的关系
fre_control1=(int)( fr+0.5) > (int) fr ? (int)fr+1:(int)fr; //四舍五进
time_flag1=1;
i1=0;
tim_no=1; //打开频率控制标志
}
break ;
4.利用中断回调函数,通过中断计数,根据计数值跟控制参数的计数关系实现调频目的。
if(tim_no ==1)
{
if( time_flag1 == 1 ) //通道1调频
{
i1++;
if( i1==fre_control1 )
{
i1=0;
HAL_GPIO_TogglePin (GPIOC ,GPIO_PIN_0 );
}
}
}
这里可以利用标志位实现多通道调频,我用逻辑分析仪实测6个通道同时调频1-100HZ误差不超过0.5HZ。
以上是关于STM32利用TIM3产生一个1--100Hz可调频率的主要内容,如果未能解决你的问题,请参考以下文章
基于霸道秉火的STM32F103ZET6嵌入式开发之------基于定时TIM3的PWM实验