stm32定时器之Output Compare

本文详细介绍了如何使用STM32F103VB单片机通过MOC3020驱动BTA16可控硅,实现对电机进行相位控制调速。通过定时器配置和中断处理,实现在检测到过零信号时延时输出,从而达到调速目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32f103vb发出逻辑信号给MOC3020,控制BTA16可控硅的通断。

在检测到过零信号时,延时x毫秒,输出1;延时y毫秒,关闭输出。 实现相位控制调速感应电机(小功率)。



在stm32 discovery开发板上,使用蓝灯和绿灯模拟。


采用定时器的OC,比较输出来做。

选用VBT6的一个Timer来做,它有4个通道可以使用,可以拿来控制4路可控硅输出。


使用CubeMX做外设配置。

针脚配置:


这样不把输出直接发送到Pin上。 能直接发送到Pin上,使用One Pulse Mode 比较方便。 受限于委托公司的设计限制,没法使用脉冲模式。


注意Prescaler的值, 值  = 时钟频率/1000 - 1, 及为1ms.

Pulse 值,表示计数器到达多少时,做输出,触发中断。


中断需要启用。


使用按键来触发定时器,启用两个通道,这里简单使用延时来按键消抖,可以使用状态机处理:

    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
      
      HAL_Delay(20);
      if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
        // strat timer
        __HAL_TIM_SET_COUNTER ( &htim2, 0); // 设置0
        HAL_TIM_OC_Start_IT  ( &htim2,  TIM_CHANNEL_1); 
        HAL_TIM_OC_Start_IT  ( &htim2,  TIM_CHANNEL_2); 

      }
    }

定义两个flag:

__IO uint8_t on_led_blue = 0;
__IO uint8_t on_led_green = 0;

在回调函数处理:

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
    if (!on_led_blue) {
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
      on_led_blue = 1;
      HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_1);
      //设置新的时间
      uint16_t delay_new = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, delay_new + 1999);
      HAL_TIM_OC_Start_IT  ( &htim2, TIM_CHANNEL_1);
    }
    else if (on_led_blue) {
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
      on_led_blue = 0;
      HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_1); 
    }
    
 
  } 

  
    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    {
      if (!on_led_green) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);#define __HAL_TIM_SET_COMPARE (   __HANDLE__,  
    __CHANNEL__,  
    __COMPARE__  
 ) 
        on_led_green = 1;
        HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_2);
        //设置新的时间
        uint16_t delay_new = __HAL_TIM_GET_COUNTER(&htim2, TIM_CHANNEL_2);
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, delay_new + 1999);
        HAL_TIM_OC_Start_IT  ( &htim2, TIM_CHANNEL_2);
      }
      else if (on_led_green) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
        on_led_green = 0;
        HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_2); 
      }
    }
  
}

使用flag来区别HAL_TIM_ActiveChannel是 delay_on,还是delay_off。

#define __HAL_TIM_SET_COMPARE (   __HANDLE__,  
    __CHANNEL__,  
    __COMPARE__  
 ) 

这个宏可以方便的 Sets the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function.


效果表现为:

按键按下,蓝灯3秒亮,2秒后灭;绿灯5秒后亮,2秒后灭。


总之,使用Timer的输出Pin接Moc3020,脉冲方式是最省事省心的做法。 

而其他Pin的话,只能这里使用一个替代的方法来实现。

### STM32定时器PWM配置教程 #### 使用STM32CubeMX进行初步配置 在STM32CubeMX软件中,可以通过图形化界面轻松完成大部分硬件资源的初始配置。对于PWM功能而言,主要涉及的是定时器的选择及其参数设定。 - 打开项目后,在Pinout & Configuration页面找到并点击Timers模块下的相应定时器(比如TIM1、TIM2等),将其Mode设为Output Compare PWM mode 1或者mode 2取决于具体需求[^1]。 - 接着调整Prescaler预分频系数以匹配期望的工作频率;Auto Reload Register则决定了PWM周期长度,即占空比的最大范围。这些设置直接影响到最终产生的PWM波形特性[^4]。 #### 编写驱动代码实现PWM输出 经过上述步骤之后,还需要编写少量C语言程序来进一步定制行为逻辑: ```c // 假定已经完成了必要的初始化操作 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 启动指定通道上的PWM信号发生过程 __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,value); // 动态改变比较寄存器值value可调节占空比大小 ``` 这里`htim3`代表所使用的定时器实例对象名称,而`TIM_CHANNEL_X`表示具体的PWM输出端口号。通过调用`__HAL_TIM_SET_COMPARE()`函数能够实时更新PWM脉冲宽度,进而达到精确控制外部设备的目的[^3]。 #### 控制外设如舵机的具体应用案例 针对某些特定应用场景,例如利用PWM去操控伺服马达转动角度的情况,则需注意以下几点事项: - 舵机通常接受的标准PWM信号具有固定的载波频率约为50Hz; - 改变`TIM_SetCompare2(TIM3,pwm_value)`里的变量`pwm_value`即可影响PWM高电平持续期间长短,从而间接决定舵片偏转程度[^2]。 综上所述,掌握了以上要点便可以在STM32平台上顺利建立起基于定时器组件的PWM控制系统,并据此开展更多深入探索实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

容沁风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值