tag 标签: 定时器

相关帖子
相关博文
  • 热度 8
    2025-6-17 16:39
    15502 次阅读|
    2 个评论
    概述 相关API函数 举例:定时发送一个事件 总结 概述 ESP32有一组外设--定时器组。它可以选择不同的时钟源和分配系数。该定时器应用灵活,超时报警可以自动更新计数值。 相关API函数 1.定时器配置结构体 typedefstruct { gptimer_clock_source_tclk_src; /* 定时器时钟源,在clk_tree_defs.h中有个枚举soc_periph_gptimer_clk_src_t */ gptimer_count_direction_tdirection; /*计数方向 ,定义在timer_typers.h的枚举gptimer_count_direction_t中*/ uint32_tresolution_hz; /*频率分辨率,单位HZ,每个滴答步长是1/ resolution_hz秒*/ intintr_priority; /*定时器中断优先级,如果设置0,将分配优先级较低的中断*/ struct { uint32_tintr_shared: 1 ; /*设置是否与其他外设共享此定时器终端号*/ } flags; } gptimer_config_t ; 2.创建定时器句柄 esp_err_tgptimer_new_timer ( constgptimer_config_t *config, //填充完成的gptimer_config_t变量 gptimer_handle_t *ret_timer //返回的定时器句柄,所以在调用之前先要定义一个gptimer_handle_t变量,用于返回定时器句柄 ) 3.设置报警并触发一个事件 配置警报动作 esp_err_tgptimer_set_alarm_action ( gptimer_handle_ttimer, //上一步返回的定时器句柄 constgptimer_alarm_config_t *config //警报的相关配置 ) typedefstruct { uint64_talarm_count; /*警报的目标计数值 */ uint64_treload_count; /*只有当auto_reload_on_alarm设置为ture,才会有影响,重载计数值 */ struct { uint32_tauto_reload_on_alarm: 1 ; /*当警报发生时,重载按硬件开始 */ } flags; } gptimer_alarm_config_t ; 注册事件回调函数 esp_err_tgptimer_register_event_callbacks ( gptimer_handle_ttimer, //返回的定时器句柄 constgptimer_event_callbacks_t *cbs, //事件回调函数 void *user_data //传递给回调函数的参数 ) //回调函数的函数原型,在gptimer_event_callbacks_t结构体里定义 typedefbool (* gptimer_alarm_cb_t )(gptimer_handle_ttimer, //定时器句柄 constgptimer_alarm_event_data_t *edata, //传递报警事件的相关数据 void *user_ctx //用户自定义参数 ) 4.使能定时器 esp_err_tgptimer_enable(gptimer_handle_ttimer) 5.启动定时器 esp_err_tgptimer_start(gptimer_handle_ttimer) 举例:定时发送一个事件 /** * Copyright (C) 2024-2034 HalfMoon2. * All rights reserved. * * @file Filename without the absolute path * @brief Brief description * @author HalfMoon2 * @date 2025-06-13 * @version v0.1 * * @revision history: * 2025-06-13 - Initial version. */ # include stdio.h # include driver/gptimer.h # include freertos/FreeRTOS.h # include freertos/task.h # include esp_err.h # include esp_log.h ​ # define event_bit0 (10) EventGroupHandle_teventGroup= NULL ; ​ boolgptimer_alarm_cb (gptimer_handle_ttimer, constgptimer_alarm_event_data_t *edata, void *user_ctx) { BaseType_tpxHigherPriorityTaskWoken; xEventGroupSetBitsFromISR (eventGroup,event_bit0,pxHigherPriorityTaskWoken); returnfalse; } ​ voidevent_task ( void *pvParam) { while ( 1 ){ if ( xEventGroupWaitBits (eventGroup,event_bit0,pdTRUE,pdFALSE,portMAX_DELAY)== 1 ){ ESP_LOGI ( "gptimer" , "alarm success!!!" ); } } } ​ staticvoidgptimer_init () { gptimer_handle_tgptimer= NULL ; gptimer_config_ttimer_config={ .clk_src=GPTIMER_CLK_SRC_DEFAULT, .direction=GPTIMER_COUNT_UP, .intr_priority= 0 , .resolution_hz= 1 * 1000 * 1000 , //分辨率为1M,一次滴答1us .flags.intr_shared= false }; //创建定时器句柄 ESP_ERROR_CHECK ( gptimer_new_timer (timer_config, gptimer)); ​ //设置警报动作,目标计数值,是否自动重载等 gptimer_alarm_config_talarm_config={ .alarm_count= 1000000 , //一次滴答1us,这里刚好1s .reload_count= 0 , .flags.auto_reload_on_alarm= true }; ESP_ERROR_CHECK ( gptimer_set_alarm_action (gptimer, alarm_config)); ​ //注册警报事件 gptimer_event_callbacks_tcbs={ .on_alarm=gptimer_alarm_cb }; ESP_ERROR_CHECK ( gptimer_register_event_callbacks (gptimer,cbs, NULL )); ​ //使能定时器 ESP_ERROR_CHECK ( gptimer_enable (gptimer)); ​ //开启定时器 ESP_ERROR_CHECK ( gptimer_start (gptimer)); } ​ voidapp_main ( void ) { //创建一个事件组 eventGroup= xEventGroupCreate (); gptimer_init (); xTaskCreatePinnedToCore (event_task, "event_task" , 2048 , NULL , 3 , NULL , 1 ); } ​ 从打印可以看出,刚好1秒触发一次警报。 gptimer还支持动态更新计数值,可在回调函数中增加如下代码 gptimer_alarm_config_talarm_config= { .alarm_count=edata-alarm_value +1000000 , // 下一次警报在当前警报的基础上加 1s }; // 更新警报值 gptimer_set_alarm_action (timer, alarm_config); 总结 一定要注意,在回调函数中不能使用ESP_LOGI或printf等打印函数,否则系统会崩溃。
  • 热度 5
    2023-9-25 07:49
    3791 次阅读|
    3 个评论
    上一篇拆解了因为媳妇为我做蛋糕而买的 打蛋器 ,那么,面包是用什么做出来的呢?用的是下面这款美的机械式电烤箱。 当然,电烤箱不是因为做蛋糕单独买的,这是在之前的公司上班,公司发的过节礼品卡,我用礼品卡在平台上兑换的,想得很美好,因为当时特别想吃烤地瓜,但是仅仅用它来烤了一次地瓜,就没再用了,因为没烤熟,考出来效果跟大爷街边卖的差了十万八千里。 闲置了怎么能行,就把它拆了让他继续发光发热吧。 顶部标注了型号功率等信息,过了3C认证。右下角是个提醒的标志,设备在工作时候,这个面是烫的,不能用手摸。 再看下正面,很简洁,一个上下开合的玻璃门里面可以看到上下2根加热管,中间是托架和烤盘,右侧从上往下依次是电源指示灯,温度旋钮,定时旋钮。温度最高可到230℃,时间可以定时30分钟,或者可以选择长通选项。 背面是个隆起的后盖,后盖上有个黑色塑料柱,应该是为了让他工作时跟其他物品保持一定距离的作用。 开拆,拆掉周边螺丝后,这是上盖 拿掉上盖是这个样子的,是不是有点LOW? 后盖,220V电源从后盖进入,左下角还有一排透气散热孔,上面应该是烤地瓜时候崩上的,好吧,确实有碍观瞻。 左侧是玻璃门的弹簧拉手,关闭盖子时,弹簧可以把盖子自动合上,同事保证盖子不会自动开了。上下是通过一根线串联的两根加热管。 加热管应该是这样的,一个石英管里有加热丝,通电后发光发热。通过电烤箱标注的额定功率:750W,每根加热管平均分配功率的话,每根加热管功率是750÷2=375W;电压平均分配,每根加热管上的电压220V÷2=110V;通过加热管的电流为:375÷110V=3.4A,当然也可以直接这样计算:750÷220V=3.4A;上面这个计算方式是为了大体估算下每根加热管的电阻丝内阻:110÷3.4=32Ω。 右侧就是电路部分了,220V市电进入后,接地线直接连接了烤箱外壳,零线火线连接了调温机械装置,定时机械装置,还有一个电源指示灯。 详细看下三个部分,从上往下,依次是电源指示灯,调温装置,定时装置。 外面的塑料旋钮是可以直接拔下来的 拔下后,可以看到固定装置的螺丝 拆下的定时装置,可以支持交流250V/15A的耐压和过流能力。 来个正面的,看着挺复杂的样子。 电源指示灯,看!热缩套管里有一个隐藏的限流电阻 好,拆解完成,绘制下电路原理图,分析下, 220V电源输入后,经过定时器,然后分别流向加热管和电源指示灯,然后经过控温器最终连接到零线。只有控温器设置了温度,定时器设置为定时模式或者长通模式时,整个电路才能形成闭环,电路才能导通,同时电源指示灯亮起。 线面再来详细看下两个核心部件:控温器和定时器 这是控温器拆出来后的样子: 看下正面有标识参数 这是接入电路的两个触点,一进一出,串联到电路中。 他其实只有2种状态,如下是导通状态 如下是断开状态 那么问题来了,既然他只有开和关两种状态,他又是怎么实现控温的呢? 玄机在这两个金属片上,他们是定温热敏感金属片,就是在固定的温度对应产生固定的形变。烤箱内的温度变化,传导到金属片上,金属片产生形变,导致开或者关的动作,本质上其实是控制了开关的时长和频率,实现了温度的控制,类似于PWM控制风扇转速的逻辑。 再来看看这个定时器: 到计时时间后,这个铃会响一下 接入电路的金属触点 看下正面,边缘通过弯曲的金属卡扣固定,用钳子掰直就可以拆开。 先拆掉外壳 接入电路的触点部分,弹上去导通,弹下来断开。 是这样的连接关系 最后来张完整的,整个定时器的机械结构跟机械挂钟的逻辑其实是一样的,通过发条发力,转动到指定的位置后,触发开关动作。 以上就是本次拆解全部内容,如果记得文章不错,欢迎点赞和转发,如果对文章内容有异议,也欢迎留言指正。
  • 热度 10
    2023-5-8 12:13
    3866 次阅读|
    0 个评论
    555定时器产生方波原理(四款555定时器产生方波的电路详解) - 555集成电路大全 电路图简介: 本文主要介绍了555定时器产生方波原理(五款555定时器产生方波的电路详解)。555定时器的功能主要由两个比较器决定。两个比较器的输出电压控制RS触发器和放电管的状态。在电源与地之间加上电压,当5脚悬空时,则电压比较器C1的同相输入端的电压为2VCC/3,C2的反相输入端的电压为VCC/3。在单稳态工作模式下,555定时器作为单次触发脉冲发生器工作。 1、555定时器原理分析 555定时器的功能主要由两个比较器决定。两个比较器的输出电压控制RS触发器和 放电管 的状态。在电源与地之间加上电压,当5脚悬空时,则 电压比较器 C1的同相输入端的电压为2 VCC /3,C2的反相输入端的电压为VCC/3。若触发输入端 TR 的电压小于VCC /3,则比较器 C2 的输出为 0,可使 RS 触发器置 1,使输出端 OUT=1。如果阈值输入端 TH 的电压大于 2VCC/3,同时 TR 端的电压大于VCC /3,则 C1 的输出为 0,C2 的输出为 1,可将 RS 触发器置 0,使输出为低电平。 555引脚 引脚功能 单稳态模式: 在单稳态工作模式下,555定时器作为单次触发脉冲发生器工作。当触发输入电压降至VCC的1/3时开始输出脉冲。输出的脉宽取决于由定时 电阻 与电容组成的RC网络的时间常数。当电容电压升至VCC的2/3时输出脉冲停止。根据实际需要可通过改变RC网络的时间常数来调节脉宽。 输出脉宽t,即电容电压充至VCC的2/3所需要的时间由下式给出: 虽然一般认为当电容电压充至VCC的2/3时电容通过OC门瞬间放电,但是实际上放电完毕仍需要一段时间,这一段时间被称为弛豫时间。在实际应用中,触发源的周期必须要大于弛豫时间与脉宽之和(实际上在工程应用中是远大于)。 双稳态模式: 双稳态工作模式下的555芯片类似基本RS触发器。在这一模式下,触发引脚(引脚2)和复位引脚(引脚4)通过上拉电阻接至高电平,阈值引脚(引脚6)被直接接地,控制引脚(引脚5)通过小电容(0.01到0.1F)接地,放电引脚(引脚7)浮空。所以当引脚2输入高电压时输出置位,当引脚4接地时输出复位。 无稳态模式: 无稳态工作模式下555定时器可输出连续的特定频率的方波。电阻R1接在VCC与放电引脚(引脚7)之间,另一个电阻(R2)接在引脚7与触发引脚(引脚2)之间,引脚2与阈值引脚(引脚6)短接。工作时电容通过R1与R2充电至2/3VCC,然后输出电压翻转,电容通过R2放电至1/3VCC,之后电容重新充电,输出电压再次翻转。 无稳态模式下555定时器输出波形的频率由R1、R2与C决定: 对于双极型555而言,若使用很小的R1会造成OC门在放电时达到饱和,使输出波形的低电平时间远大于上面计算的结果。 为获得占空比小于50%的矩形波,可以通过给R2并联一个二极管实现。这一二极管在充电时导通,短路R2,使得电源仅通过R1为电容充电;而在放电时截止以达到减小充电时间降低占空比的效果。 2、555定时器产生方波原理电路图解555定时器产生方波原理(一):占空比可调的方波发生器 CB555定时器的工作原理可列表说明: 空比可调的方波 信号发生器 电路图 图 利用CB555定时器设计方波电路原理图 占空比可调的方波信号发生器分析如图2所示,电路只要一加上电压VDD, 振荡器 便起振。刚通电时,由于C上的电压不能突变,即2脚电位的起始电平为低电位,使555置位,3脚呈高电平。C通过AR、D1对其充电,充电时间CRtA7.0充。买电子元器件现货上唯样商城。压充到阈值电平2/3VDD时,555复位,3脚转呈低电平,此时C通过Dl、RB、555内部的放电管放电,放电时间CRtB7.0放。则振荡周期为放充ttT。 555定时器产生方波原理(二):555定时器的方波发生器 这是一个无线电信号线路和电视的最有用的方波发生器项目。方波是最适合用于测试信号的中频(IF)地带,将通过中频 变压器 没有任何衰减,不管是什么电路的调谐频率。555TImer是配置非稳态运行,这意味着它将触发本身作为一个 多谐振荡器 自由运行。计时元件电阻R1,R2和电容器(C1-6)在此图中显示的值,产生的六个频率1Hz的,10HZ,100HZ,1KHZ,如果你想产生一个可变频率10kHz到100kHz您可以用一个100K的迷你系列10K电阻微调电位连接,68K电阻。这方波振荡器的电子项目,可提供5至18伏直流输出电压从电源供电,但通常建议使用9伏直流电源。 (本文来源网友上传,如有侵权,可联系管理员删除)
  • 热度 2
    2020-6-23 14:04
    3742 次阅读|
    0 个评论
    LPTIM操作模式: 1. 连续运行模式: 可以由软件或触发事件启动,一旦运行后则不会主动停止,必须由软件关闭,新的触发事件会被忽略 2. 一次触发模式: 定时器由触发事件启动,当计数值到达ARR值(自动重装载值)时停止,新的触发事件将重启定时器 (例外情况:CFGR:WAVE标志置位后,定时器只能被触发启动一次,后续的触发事件会被忽略) 定时器启动后,但计数值未达到ARR值时,此期间的触发事件会被忽略 LPTIM计数模式: CKSEL=0,COUNTMODE=0:内部时钟计数,每个内部时钟脉冲更新一次计数值 CKSEL=0,COUNTMODE=1:外部信号计数(内部时钟同步),每个内部时钟脉冲对外部信号进行采样并更新计数值,因此外部信号的频率应该低于内部时钟频率,同时内部时钟不应该被分频(即PRESC =000) CKSEL=1,COUNTMODE=X:外部时钟计数,此时定时器不需要内部时钟(也不需要毛刺过滤时) LPTIM编码器模式: LPTIM操作注意点: 1. SNGSTRT/CNTSTRT位必须在定时器使能时写入(即CR:ENABLE位为1时可以写入) 2. 连续运行模式和一次触发模式可以在运行过程中转换,如果当前模式为连续运行模式,置位SNGSTRT将切换至一次触发模式,计数值到达ARR值时,定时器自动停止;如果当前模式为单次触发模式,置位CNTSTRT将切换至连续运行模式,计数值到达ARR值时,定时器自动重启 3. TIMEOUT功能:第一个触发事件启动定时器,接下来的触发事件则复位计数值,重新开始计数 同单脉冲模式,只是最后的保持电平取决于输出极性配置(又WAVPOL位控制) 5. ARR寄存器的值必须大于CMP寄存器的值 6. PRELOAD位控制ARR和CMP寄存器的数据加载时刻,PRELOAD=0时,写操作会被立即执行;PRELOAD=1时,写操作的值在定时器超时时加载(如果定时器已经启动的话);ARROK和CMPOK状态位分别用于确认ARR和CMP寄存器写操作是否执行完成( 未做ARROK和CMPOK判定时的连续写入会导致不可预料的结果 ) 7. CR:ENABLE位置位后,定时器需要2个计数时钟才会被真正启动。CFGR(配置寄存器)和IER(中断使能寄存器)必须在该位为0时才能被修改
  • 热度 2
    2020-4-12 20:29
    5051 次阅读|
    1 个评论
    【富芮坤物联网开发板评测】FR801xH官方Timer驱动代码
    FR80xH芯片内有2个16位定时计数器,支持单周期或者周期模式。定时器框图如下: 可以通过4个寄存器去操作定时器。分别是加载寄存器,计数寄存器,控制寄存器和中断清除寄存器。 FR80xH芯片内存映射如下图 我们可以看到定时器的地址是 0x50002000, 所以我们看到代码中有关定时器的一些定义如下: 定时器寄存器相关定义和定时器定义如下: 这里定义了定时器类型,定时器类型里面包含了 4 个定时器寄存器的相关定义,然后我们就可以通过这个定时器类型 struct timer 操作定时器了。 官方 driver_timer.h 中提供了 7 个函数来操作定时器,分别如下: void timer_run(uint32_t timer_addr); /* 启动定时器, timer_addr 只能是上面定义的 TIMER0 或 TIMER1*/ void timer_stop(uint32_t timer_addr); /* 停止定时器 */ void timer_reload(uint32_t timer_addr); /* 重新加载计数器 */ uint32_t timer_get_load_value(uint32_t timer_addr); /* 获取计数器重载值 */ uint32_t timer_get_current_value(uint32_t timer_addr); /* 获取计数器计数值 */ void timer_clear_interrupt(uint32_t timer_addr); /* 定时器清中断 */ uint8_t timer_init(uint32_t timer_addr, uint32_t count_us, uint8_t run_mode); /* 初始化定时器, count_us 指明周期时间, run_mode 指明定时器运行单周期模式还上周期模式 */ 值得说明的是,官方Demo对定时器的操作是通过系统层的定时器API函数去操作的,官方demo好像也没有开放有关这个系统层定时器操作的相关代码,然后就算是有了这个驱动文件,对于官方的Demo还是建议不要使用这个硬件层的定时器操作函数。希望官方开发系统的相关代码以便分析使用。
相关资源