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可调频率的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103 使用TIM3产生四路PWM

STM32通用定时器PWM输出

基于霸道秉火的STM32F103ZET6嵌入式开发之------基于定时TIM3的PWM实验

怎样使stm32f4内部产生正弦波驱动wm8978发出声音

主从配置中的 STM32 奇数 timer1 行为 - mb 代码问题

为啥我的stm32 的tim3 1ms中断时间不准