stm32定时器之Output Compare

发布者:备战最新更新时间:2017-09-27 来源: eefocus关键字:stm32  定时器  Output  Compare 手机看文章 扫描二维码
随时随地手机看文章

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

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



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


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

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


使用CubeMX做外设配置。

针脚配置:


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


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

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


中断需要启用。


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


  1. if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {  

  2.     

  3.   HAL_Delay(20);  

  4.   if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {  

  5.     // strat timer  

  6.     __HAL_TIM_SET_COUNTER ( &htim2, 0); // 设置0  

  7.     HAL_TIM_OC_Start_IT  ( &htim2,  TIM_CHANNEL_1);   

  8.     HAL_TIM_OC_Start_IT  ( &htim2,  TIM_CHANNEL_2);   

  9.   

  10.   }  

  11. }  


定义两个flag:


  1. __IO uint8_t on_led_blue = 0;  

  2. __IO uint8_t on_led_green = 0;  


在回调函数处理:


  1. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)  

  2. {  

  3.     

  4.   if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  

  5.   {  

  6.     if (!on_led_blue) {  

  7.       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  

  8.       on_led_blue = 1;  

  9.       HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_1);  

  10.       //设置新的时间  

  11.       uint16_t delay_new = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);  

  12.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, delay_new + 1999);  

  13.       HAL_TIM_OC_Start_IT  ( &htim2, TIM_CHANNEL_1);  

  14.     }  

  15.     else if (on_led_blue) {  

  16.       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  

  17.       on_led_blue = 0;  

  18.       HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_1);   

  19.     }  

  20.       

  21.    

  22.   }   

  23.   

  24.     

  25.     if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)  

  26.     {  

  27.       if (!on_led_green) {  

  28.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);#define __HAL_TIM_SET_COMPARE (   __HANDLE__,    

  29.     __CHANNEL__,    

  30.     __COMPARE__    

  31.  )   

  32.         on_led_green = 1;  

  33.         HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_2);  

  34.         //设置新的时间  

  35.         uint16_t delay_new = __HAL_TIM_GET_COUNTER(&htim2, TIM_CHANNEL_2);  

  36.         __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, delay_new + 1999);  

  37.         HAL_TIM_OC_Start_IT  ( &htim2, TIM_CHANNEL_2);  

  38.       }  

  39.       else if (on_led_green) {  

  40.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);  

  41.         on_led_green = 0;  

  42.         HAL_TIM_OC_Stop_IT  ( &htim2, TIM_CHANNEL_2);   

  43.       }  

  44.     }  

  45.     

  46. }  


使用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  定时器  Output  Compare 引用地址:stm32定时器之Output Compare

上一篇:stm32cubemx下stm32f103读ds18b20
下一篇:stm32 4*4矩阵键盘

推荐阅读最新更新时间:2024-03-16 15:38

ATmega 16单片机的定时器/计数器相关寄存器(二)
T/C0相关寄存器 1.TCCR0 T/C0控制寄存器 FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 位7 FOC0:强制输出比较位。 FOC0仅在WGM 设置为非PWM模式时才有效。为了保证与未来器件的兼容性,在使用PWM时,写TCCR0要对其清零。对其写1后,波形发生器将立即进行比较操作。比较匹配输出引脚OC0将按照COM 的设置输出相应的电平。要注意FOC0类似一个锁存信号,真正对强制输出比较起作用的是COM 的设置。FOC0不会引发任何中断,也不会在利用OCR0作为TOP的CTC模式下对定时器进行清零的操作。读FOC0的返回值永远为0
[单片机]
Stm32入门——Systick定时器
Systick定时器是什么? 从原理上来说,Systick定时器和开发板上的通用定时器没有区别。从功能上来说,Systick定时器主要是用来用来进行延时的(就是让CPU一直重复计数这件事),而通用或者高级定时器往往用来进行PWM输出、输入捕获等功能。至于为什么不用通用定时器或者高级定时器来完成延时功能,则是考虑到节省MCU的资源来做更重要的事。 Systick定时器相关寄存器 CTRL Systick控制和状态寄存器(存放使能位、中断位、时钟源选择位等) LOAD Systick自动重装载值寄存器 VAL Systick当前值寄存器 (这里插一句,建议大家在学习的时候直接对寄存器进行操作,不要用库函数,这样前期虽然会有困难,但
[单片机]
STM32串口通信基本原理
介绍串口通信 按照数据传送方向分类 单工 :数据传输只支持数据在一个方向上传输 半双工 :允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口 全双工 :允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端 分别如下图中的a、b、c所示。 按照通信方式分类 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线 在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进
[单片机]
STM32_DCMI
1:DCMI简介 DCMI是STM32F4芯片自带的一个数字摄像头接口,该接口是一个同步并行接口,能够接受外部8位、10位、12位、14位CMOS摄像头模块发出的高速数据流 可支持的数据格式: YCbCr4:2:2 RGB565逐行视频 压缩数据 (JPEG) 2:DCMI功能概述 数字摄像头接口是一个同步并行接口,可接收 高速(可达 54 MB/s)数据流 。该接口包含多 达 14 条数据线 (D13-D0) 和一条像素时钟线 (PIXCLK)。像素时钟的极性可以编程,因此可 以在像素时钟的上升沿或下降沿捕获数据。 这些数据被放到 32 位数据寄存器 (DCMI_DR) 中,然后通过通用 DMA 进行传输。 图
[单片机]
STM32_DCMI
STM32 系统时钟的配置
1.时钟的驱动 有三种不同的时钟源可被用来驱动系统时钟: ● 内部高速 (HSI)8MHz RC 振荡器时钟 ● 外部高速 (HSE) 振荡器时钟 ● PLL 时钟 2.系统时钟的简介 在STM32中,我们说要配置系统时钟就是指的配置下图标识红色的部分“SYSCLK(系统时钟)”.系统时钟SYSCLK是同STM32中绝大部分期间工作的时钟源,如下图所示,系统时钟可以为IIC, AHB,APB,DMA等配置时钟。 3.系统时钟的配置 例:如果在外部接入8MHZ的晶振,需要配置成48MHZ的系统时钟。 分析:因为要使用8MHZ的外部时钟,得到48MHZ的系统时钟,则需要不分频使其倍频6倍得到系统时钟,因而我准备配置的路线如 下图所
[单片机]
STM32是否可以跑linux
操作系统有两种 用MMU的 和 不用MMU的 用MMU的是Windows MacOS Linux Android 不用MMU的是FreeRTOS VxWorks ucOS... CPU有两种 带MMU的 和 不带MMU的 带MMU的有 Cortex-A系列 ARM9 ARM11系列 不带MMU的有 Cortex-M系列... STM32是M系列...不可能运行Linux... ucLinux不算Linux的...
[单片机]
STM32的printf函数重定向
在前面学习了STM32的串口编程,通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们可以实现STM32工程上的printf()函数了,方便用于程序开发中调试信息的打印。 1. 法1:使用MicroLIB库 1.1 KEIL-MDK中的Use MicroLIB选项 在MDK开发环境中, MicroLib是缺省c库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。 MicroLib进行了高度优化以使代码变得很小,功能比缺省c库少,不具备某些ISO c特性,部分库函数的运行速度也比较慢,如内存拷贝函数memcpy()。 MicroLib与缺省c库之间
[单片机]
STM32低功耗唤醒方式
MCU进入低功耗之后,以极低的功耗维持着系统“活着”,但是醒过来是需要一定条件的,比如定个“闹钟”,按键“按一下”等,目前常用的“正常的”唤醒方式有以下几种: 1、RTC定时唤醒; 2、外部中断唤醒(按键或者通讯唤醒); 3、特殊唤醒引脚唤醒(某些引脚具有专门的唤醒功能)。 下面,我们再来看一看如何通过RTC和外部中断唤醒MCU。 1、RTC定时唤醒 依然是从手册中我们可以看到,所有的RTC时间都可以把MCU从低功耗模式中唤醒: 介绍使用RTC的定时功能实现,定时1S唤醒一次,使用cubemx进行对RTC进行配置: 生成代码的时候,勾选这个选项,可以把不用的引脚配置为模拟输入模式,降低功耗: RTC的配置如图,使能RTC,
[单片机]
<font color='red'>STM32</font>低功耗唤醒方式
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved