上次制作无屏幕版本的万用表在测量交流信号时,没有频率和占空比测量功能,这次使用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.频率占空比测量相关推荐

  1. 开源ESP32彩屏WIFI/BLE智能万用表制作过程:1.外壳与屏幕选型

    开源ESP32彩屏WIFI/BLE智能万用表制作过程:1.外壳与屏幕选型 一.前言 二.为什么制作万用表 三.选择外壳 四.选择屏幕 一.前言 小伙伴们大家好,去年7月份开始全职创业已经过去一整年了, ...

  2. 开源ESP32彩屏WIFI/BLE智能万用表制作过程:2.按键选择

    今天收到了2款屏幕和橡胶按键样品,屏幕引脚是FPC排线,转接板还没收到,要2-3天才能点亮,和外壳对比一下2.4寸和2.0寸,还是屏幕大些看的顺眼. 上一期发的文章里效果图是平面的按键,并没有介绍是什 ...

  3. 智能小车制作过程(今日笔记+)

    如何让智能小车旋转90度 直流电机的话 左轮后转时间=右轮前转时间 同时进行 即可实现左转90度 时间要自己摸索 步进电机 左轮后转脉冲数=右轮前转脉冲数 同时进行 即可实现左转90度 脉冲数要自己摸 ...

  4. 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_ ...

  5. 启明云端分享|基于ESP32的1.54智能屏应用于无叶风扇、微波炉、空净器等,支持WIFI和蓝牙

    提示:近日由启明云端提供的基于ESP32的1.54智能屏(1.54寸彩屏,分辨率240*240)已被批量应用于无叶风扇.空气净化器.咖啡机.油烟机.按摩椅等家电.家居产品上. 基于ESP32的1.54 ...

  6. RT-Thread GCC VSCode等开源工具链 在智能小车制作中的应用

    学 校: 山东大学(威海) 队伍名称: 海韵五队 参赛队员: 崔海勤.刘子晖.赵润萌 带队教师: 王小利 简 介: 社会的不断进步与发展,伴随的是对自动化技术需求的不断增加,同时自动化程序也呈现出任务 ...

  7. ESP32彩屏应用开源了https://github.com/wireless-tag-cn/lv_port_esp32

    号外.号外-- 久久等候的ESP32彩屏终于开源了 https://github.com/wireless-tag-cn/lv_port_esp32 启明云端是国内乐鑫最高级别的核心合作伙伴,年初推出 ...

  8. 通过WiFi控制智能小车机器人制作过程详解

    之前发的作品都是基于蓝牙控制的智能小车机器人,由于蓝牙的传输范围比较小,所以控制距离的局限性比较大,并且通过蓝牙传输视频会明显出现卡屏的现象. 而通过WiFi方式控制智能小车机器人能达到100米左右的 ...

  9. 【STC开源项目】STC51单片机LRC万用表表制作程序+PCB文件

    [STC开源项目]STC51单片机LRC万用表表制作程序+PCB文件 申明:本项目来源于51黑单片机论坛:http://www.51hei.com/bbs/dpj-175080-1.html 本篇文章 ...

最新文章

  1. java me sdk_Java ME SDK 3.0不运行的问题及解决
  2. python第三方库排行-scikit-learn: Python强大的第三方库
  3. 前端性能优化—js代码打包
  4. redis高可用原理及demo
  5. 乐高小颗粒履带机器人_玩转乐高大颗粒积木(四十二)——乐高不倒翁、轮式是挖掘机、大颗粒皮筋车...
  6. 【PP生产订单】入门介绍(十三)
  7. JavaSE项目之聊天室swing版
  8. thread.Join(); 让主线程等待自己完成
  9. homebrew mysql conf_homebrew 安装mysql后,如何配置mysql
  10. linux系统管理学习笔记之八---进程与作业的管理
  11. 《极客学院 --NSAttributedString 使用详解-4-UITextKit 简介》学习笔记(待处理)...
  12. 微控制器MCU四大平台你了解多少?(一)
  13. Idea中找不到Java Application 的xml配置文件问题研究
  14. swift压缩图片的方法
  15. 国内IT界5大女神程序员,你知道几个
  16. 用Firefox看CHM电子书
  17. Excel快捷键大全,没有最全,只有更全!
  18. Moviepy模块之视频添加图片水印
  19. Electron 打包Mac安装包代码签名问题解决方案
  20. ActiveSync

热门文章

  1. Excel中的筛选 subtotal
  2. Eclipse的web项目放到服务器上跑
  3. 2021-2027全球与中国6G网络市场现状及未来发展趋势
  4. Kotlin 以3秒后退出应用为例,用handler+postDelayed() 实现倒计时
  5. oracle 特殊的字符,Oracle一些特殊字符转义
  6. C++实验一:类与对象——电梯
  7. 【调剂】2020年清华大学深圳国际研究生院电子信息(计算机技术)项目接收调剂信息...
  8. 一个新的项目:狼人杀(七)
  9. 利用json-bigint处理后台数据大数字问题
  10. SpringBoot 整合RabbitMq