开源ESP32彩屏WIFI/BLE智能万用表制作过程:3.频率占空比测量
上次制作无屏幕版本的万用表在测量交流信号时,没有频率和占空比测量功能,这次使用ESP32采集交流信号,计算频率和占空比。
频率为周期的倒数,占空比高电平时间T1与总周期时间T的比值,范围0%-100%
下面介绍3种实现方法,也是我逐一调试程序验证的过程。
1、先试一下用MCPWM捕获功能实现频率测量,参照官方例程配置比较简单
void M_pwm_cap_start()
{M_pwm_init();//7. Capture configuration//comment if you don't want to use capture submodule, also u can comment the capture gpio signals//configure CAP0, CAP1 and CAP2 signal to start capture counter on rising edge//we generate a gpio_test_signal of 20ms on GPIO 12 and connect it to one of the capture signal, the disp_captured_function displays the time between rising edge//In general practice you can connect Capture to external signal, measure time between rising edge or falling edge and take action accordinglymcpwm_capture_enable(MCPWM_UNIT_0, MCPWM_SELECT_CAP0, MCPWM_POS_EDGE, 0); //capture signal on rising edge, prescale = 0 i.e. 800,000,000 counts is equal to one second//enable interrupt, so each this a rising edge occurs interrupt is triggered//create queuecap_queue = xQueueCreate(1, sizeof(capture)); //comment if you don't want to use capture moduleMCPWM[MCPWM_UNIT_0]->int_ena.val = CAP0_INT_EN; //Enable interrupt on CAP0, CAP1 and CAP2 signalmcpwm_isr_register(MCPWM_UNIT_0, isr_handler, NULL, ESP_INTR_FLAG_IRAM, NULL); //Set ISR HandlerxTaskCreate(disp_captured_signal, "mcpwm_config", 4096, NULL, 5, NULL); //comment if you don't want to use capture module
}
static void IRAM_ATTR isr_handler()
{uint32_t mcpwm_intr_status;capture evt;mcpwm_intr_status = MCPWM[MCPWM_UNIT_0]->int_st.val; //Read interrupt statusif (mcpwm_intr_status & CAP0_INT_EN) { //Check for interrupt on rising edge on CAP0 signalevt.capture_signal = mcpwm_capture_signal_get_value(MCPWM_UNIT_0, MCPWM_SELECT_CAP0); //get capture signal counter valueevt.sel_cap_signal = MCPWM_SELECT_CAP0;xQueueSendFromISR(cap_queue, &evt, NULL);}MCPWM[MCPWM_UNIT_0]->int_clr.val = mcpwm_intr_status;
}
static void disp_captured_signal(void *arg)
{int add=0;float frequency;uint32_t *current_cap_value = (uint32_t *)malloc(2*sizeof(uint32_t));uint32_t *previous_cap_value = (uint32_t *)malloc(2*sizeof(uint32_t));capture evt;while (1) {xQueueReceive(cap_queue, &evt, portMAX_DELAY);if (evt.sel_cap_signal == MCPWM_SELECT_CAP0) {current_cap_value[0] = evt.capture_signal - previous_cap_value[0];previous_cap_value[0] = evt.capture_signal;current_cap_value[0] = (current_cap_value[0] / 10000) * (10000000000 / rtc_clk_apb_freq_get());if(++add>50){add=0;frequency=1000000/current_cap_value[0];printf("CAP0 : %d us\n", current_cap_value[0]);//print high timeprintf("frequency : %.2f Hz\n", frequency);}}vTaskDelay(10/portTICK_RATE_MS);}
}
用信号发生器产生PWM信号,测试试一下测量频率
对于几百Hz以内测量还是很准确的,但是没找到测量占空比的方法,测试其他方法。
2、利用ESP32的pcnt脉冲计数器,先初始化
static void pcnt_example_init(void)
{/* Prepare configuration for the PCNT unit */pcnt_config_t pcnt_config = {// Set PCNT input signal and control GPIOs.pulse_gpio_num = PCNT_INPUT_SIG_IO,.ctrl_gpio_num = PCNT_INPUT_CTRL_IO,.channel = PCNT_CHANNEL_0,.unit = PCNT_TEST_UNIT,// What to do on the positive / negative edge of pulse input?.pos_mode = PCNT_COUNT_INC, // Count up on the positive edge.neg_mode = PCNT_COUNT_DIS, // Keep the counter value on the negative edge// What to do when control input is low or high?.lctrl_mode = PCNT_MODE_KEEP, // Reverse counting direction if low.hctrl_mode = PCNT_MODE_KEEP, // Keep the primary counter mode if high// Set the maximum and minimum limit values to watch.counter_h_lim = PCNT_H_LIM_VAL,.counter_l_lim = PCNT_L_LIM_VAL,};/* Initialize PCNT unit */pcnt_unit_config(&pcnt_config);/* Configure and enable the input filter */pcnt_set_filter_value(PCNT_TEST_UNIT, 100);pcnt_filter_enable(PCNT_TEST_UNIT);/* Set threshold 0 and 1 values and enable events to watch */pcnt_set_event_value(PCNT_TEST_UNIT, PCNT_EVT_THRES_1, PCNT_THRESH1_VAL);pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_THRES_1);pcnt_set_event_value(PCNT_TEST_UNIT, PCNT_EVT_THRES_0, PCNT_THRESH0_VAL);pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_THRES_0);/* Enable events on zero, maximum and minimum limit values */pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_ZERO);pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_H_LIM);pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_L_LIM);/* Initialize PCNT's counter */pcnt_counter_pause(PCNT_TEST_UNIT);pcnt_counter_clear(PCNT_TEST_UNIT);/* Register ISR handler and enable interrupts for PCNT unit */pcnt_isr_register(pcnt_example_intr_handler, NULL, 0, &user_isr_handle);pcnt_intr_enable(PCNT_TEST_UNIT);/* Everything is set up, now go to counting */pcnt_counter_resume(PCNT_TEST_UNIT);
}
然后用定时器,每秒钟获取一次计数值,这样就能算出信号频率,每秒钟的脉冲个数就是频率。
void test_timer_periodic_cb(void *arg) {int16_t count = 0;pcnt_get_counter_value(PCNT_TEST_UNIT, &count);printf("frequency :%d Hz\n ", count);pcnt_counter_clear(PCNT_TEST_UNIT);
}
这个方法可以测量比较高的频率,下图是测量4513Hz频率信号,但是和第一种方法一样,测量不了占空比,继续测量其他方法。
3、利用ESP32外部中断引脚+定时器计数器,在上升沿中断时使能计数器,下降沿中断时获取高电平计数值n1,继续计数,直到又一个上升沿中断获取计数值n2,根据计数器的周期,可以得到计数1次的周期,从而得到高电平时间和整个周期的时间,然后就能算出占空比和频率了。
这种方式可以精确的测量出占空比和频率,但存在一个问题,当测量频率比较高时,要频繁的进入中断程序,大大降低了CPU的效率,继续改进。
4、由于我们不需要在每个信号周期都计算一次占空比和频率,所以可以再加入一个定时器,每隔1秒中断一次,在中断程序中开启外部中断,在开启外部中断测量了一次完整的信号后,关闭外部中断,这样测量速率就由这个定时器决定,不会频繁进入外部中断,经过几个小时的程序调试,最终完成占空比和频率的测量程序,下图是测量120Hz,20%的PWM信号。
开源ESP32彩屏WIFI/BLE智能万用表制作过程:3.频率占空比测量相关推荐
- 开源ESP32彩屏WIFI/BLE智能万用表制作过程:1.外壳与屏幕选型
开源ESP32彩屏WIFI/BLE智能万用表制作过程:1.外壳与屏幕选型 一.前言 二.为什么制作万用表 三.选择外壳 四.选择屏幕 一.前言 小伙伴们大家好,去年7月份开始全职创业已经过去一整年了, ...
- 开源ESP32彩屏WIFI/BLE智能万用表制作过程:2.按键选择
今天收到了2款屏幕和橡胶按键样品,屏幕引脚是FPC排线,转接板还没收到,要2-3天才能点亮,和外壳对比一下2.4寸和2.0寸,还是屏幕大些看的顺眼. 上一期发的文章里效果图是平面的按键,并没有介绍是什 ...
- 智能小车制作过程(今日笔记+)
如何让智能小车旋转90度 直流电机的话 左轮后转时间=右轮前转时间 同时进行 即可实现左转90度 时间要自己摸索 步进电机 左轮后转脉冲数=右轮前转脉冲数 同时进行 即可实现左转90度 脉冲数要自己摸 ...
- 2019年TI杯 简易电路特性测试仪 制作过程(6)——测量任务分析(Av、fH) 20/05/01
一.增益Av测量 1.增益Av测量--采样 uint8_t AV_Sample_1KHz_Handle(void) {uint8_t res = 0;if(Measure_Av_Jun.Uo_ave_ ...
- 启明云端分享|基于ESP32的1.54智能屏应用于无叶风扇、微波炉、空净器等,支持WIFI和蓝牙
提示:近日由启明云端提供的基于ESP32的1.54智能屏(1.54寸彩屏,分辨率240*240)已被批量应用于无叶风扇.空气净化器.咖啡机.油烟机.按摩椅等家电.家居产品上. 基于ESP32的1.54 ...
- RT-Thread GCC VSCode等开源工具链 在智能小车制作中的应用
学 校: 山东大学(威海) 队伍名称: 海韵五队 参赛队员: 崔海勤.刘子晖.赵润萌 带队教师: 王小利 简 介: 社会的不断进步与发展,伴随的是对自动化技术需求的不断增加,同时自动化程序也呈现出任务 ...
- ESP32彩屏应用开源了https://github.com/wireless-tag-cn/lv_port_esp32
号外.号外-- 久久等候的ESP32彩屏终于开源了 https://github.com/wireless-tag-cn/lv_port_esp32 启明云端是国内乐鑫最高级别的核心合作伙伴,年初推出 ...
- 通过WiFi控制智能小车机器人制作过程详解
之前发的作品都是基于蓝牙控制的智能小车机器人,由于蓝牙的传输范围比较小,所以控制距离的局限性比较大,并且通过蓝牙传输视频会明显出现卡屏的现象. 而通过WiFi方式控制智能小车机器人能达到100米左右的 ...
- 【STC开源项目】STC51单片机LRC万用表表制作程序+PCB文件
[STC开源项目]STC51单片机LRC万用表表制作程序+PCB文件 申明:本项目来源于51黑单片机论坛:http://www.51hei.com/bbs/dpj-175080-1.html 本篇文章 ...
最新文章
- java me sdk_Java ME SDK 3.0不运行的问题及解决
- python第三方库排行-scikit-learn: Python强大的第三方库
- 前端性能优化—js代码打包
- redis高可用原理及demo
- 乐高小颗粒履带机器人_玩转乐高大颗粒积木(四十二)——乐高不倒翁、轮式是挖掘机、大颗粒皮筋车...
- 【PP生产订单】入门介绍(十三)
- JavaSE项目之聊天室swing版
- thread.Join(); 让主线程等待自己完成
- homebrew mysql conf_homebrew 安装mysql后,如何配置mysql
- linux系统管理学习笔记之八---进程与作业的管理
- 《极客学院 --NSAttributedString 使用详解-4-UITextKit 简介》学习笔记(待处理)...
- 微控制器MCU四大平台你了解多少?(一)
- Idea中找不到Java Application 的xml配置文件问题研究
- swift压缩图片的方法
- 国内IT界5大女神程序员,你知道几个
- 用Firefox看CHM电子书
- Excel快捷键大全,没有最全,只有更全!
- Moviepy模块之视频添加图片水印
- Electron 打包Mac安装包代码签名问题解决方案
- ActiveSync
热门文章
- Excel中的筛选 subtotal
- Eclipse的web项目放到服务器上跑
- 2021-2027全球与中国6G网络市场现状及未来发展趋势
- Kotlin 以3秒后退出应用为例,用handler+postDelayed() 实现倒计时
- oracle 特殊的字符,Oracle一些特殊字符转义
- C++实验一:类与对象——电梯
- 【调剂】2020年清华大学深圳国际研究生院电子信息(计算机技术)项目接收调剂信息...
- 一个新的项目:狼人杀(七)
- 利用json-bigint处理后台数据大数字问题
- SpringBoot 整合RabbitMq