使用DMA的方式来捕获输入波形中一个周期内的高低电平的持续时间,从而计算出输入频率;

捕获分辨率在这里设置到了1us;

/*****************************************************************************
*
* File Name : main.c
*
* Description: main
*
* Copyright (c) 2014 Winner Micro Electronic Design Co., Ltd.
* All rights reserved.
*
* Author : dave
*
* Date : 2014-6-14
*****************************************************************************/
#include "wm_include.h"
#include "wm_type_def.h"
#include "FreeRTOS.h"
#include "task.h"
#include "wm_gpio.h"
#include "wm_pwm.h"
#include "wm_cpu.h"
#include "wm_dma.h"
#include "wm_gpio_afsel.h"
#include "wm_timer.h"#define COUNTER_FREQ    1000000
#define ZERO_DETEC_IO   WM_IO_PB_18
#define PWM_CAP_CHANNEL 0typedef struct _frequency_info
{volatile u32 pwmDmaCap;volatile u32 period_ticks;volatile u32 frequecy;
} frequency_info;static frequency_info f_info;static void pwm_dma_callback(void *arg)
{//printf("pwmH:%d, pwmL:%d\n", (f_info.pwmDmaCap >> 16), (f_info.pwmDmaCap & 0x0000ffff));f_info.period_ticks = (f_info.pwmDmaCap >> 16) + (f_info.pwmDmaCap & 0x0000ffff);
}static int pwm_capture_mode_dma(u8 channel, u32 freq)
{u8 dmaCh;int frequecy = 0, high, low;struct tls_dma_descriptor DmaDesc;tls_sys_clk sysclk;memset( &f_info, 0, sizeof(f_info) );tls_sys_clk_get(&sysclk);wm_pwm1_config(ZERO_DETEC_IO);tls_pwm_stop(channel);dmaCh = tls_dma_request(1, TLS_DMA_FLAGS_CHANNEL_SEL(TLS_DMA_SEL_PWM_CAP0) | TLS_DMA_FLAGS_HARD_MODE);DmaDesc.src_addr = HR_PWM_CAPDAT;DmaDesc.dest_addr = (unsigned int)&(f_info.pwmDmaCap);DmaDesc.dma_ctrl = TLS_DMA_DESC_CTRL_DEST_ADD_INC | TLS_DMA_DESC_CTRL_BURST_SIZE1 | TLS_DMA_DESC_CTRL_DATA_SIZE_WORD | TLS_DMA_DESC_CTRL_TOTAL_BYTES(400);DmaDesc.valid = TLS_DMA_DESC_VALID;DmaDesc.next = NULL;tls_dma_start(dmaCh, &DmaDesc, 0);tls_dma_irq_register(dmaCh, pwm_dma_callback, NULL, TLS_DMA_IRQ_TRANSFER_DONE);tls_pwm_cap_init(channel, sysclk.apbclk * UNIT_MHZ / freq, DISABLE, WM_PWM_CAP_DMA_INT);tls_pwm_start(channel);while(f_info.period_ticks == 0);tls_pwm_stop(channel);high = f_info.period_ticks>>16;low = f_info.period_ticks&0xffff;printf("LEVEL: H:%d, L:%d\n", high, low);frequecy = COUNTER_FREQ/(high + low);printf("input freq: %dHz\n", frequecy);f_info.frequecy = frequecy;return frequecy;
}static int gpio_initial(void)
{tls_gpio_cfg(ZERO_DETEC_IO, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_PULLHIGH);return WM_SUCCESS;
}void ctrl_task9(int *arg)
{printf("application start.\n");wm_pwm2_config(WM_IO_PB_17);tls_pwm_init(1, 60, 99, 0);tls_pwm_start(1);gpio_initial();pwm_capture_mode_dma(PWM_CAP_CHANNEL, COUNTER_FREQ);while(1){  tls_os_time_delay(HZ);}
}int misc_task_start(void (*func)(void *), char *task_name, u32 stack_size, void *arg, u8 uxTaskPriority)
{return xTaskCreate(func,          /* The function that implements the task. */task_name,      /* Just a text name for the task to aid debugging. */stack_size,     /* The stack size is defined in FreeRTOSIPConfig.h. */arg,            /* The task parameter, not used in this case. */uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */NULL);          /* The task handle is not used. */}void UserMain(void)
{misc_task_start(ctrl_task9, "ctr9", 256, NULL, 5);
}

W600 PWM 捕获功能使用示例程序相关推荐

  1. W600 PWM捕获功能

    之前理解过,可是因为没有实践所以不够深刻,现在问了下同事就又想起来了,这里记录一下: PWM捕获有两个相关的寄存器,分别存放pwm输入口所输入的波形的高电平持续时间和低电平持续时间, 每来一个周期,数 ...

  2. ASP.NET AJAX示例程序:实现IDragSource和IDropTarget接口将商品拖放至购物车中

    本文来自<ASP.NET AJAX程序设计--第II卷:客户端Microsoft AJAX Library相关>第9章第3节. 9.3 示例程序:实现IDragSource和IDropTa ...

  3. STM32笔记——定时器输入捕获功能(测量PWM的频率和占空比)

    目录 一.概述 二.输入捕获功能 2.1 输入捕获简介 2.2 输入捕获通道 三.输入捕获功能测量PWM波的频率和占空比 3.1 测量频率的方法 3.2 测量过程 一.概述 主要介绍通用定时器的输入捕 ...

  4. 【CH559L单片机】PWM功能和示例介绍

    [CH559L单片机]PWM功能和示例介绍 ✨在官方CH559单片机手册中,在定时器(Timer)这一章节介绍PWM.

  5. 基于定时器捕获功能的红外解码程序(NEC协议)

    文章目录 前言 一.红外协议简介 1. ITT Protocol 2. NEC 协议 3. Nokia NRC17 协议 二.红外解码程序(NEC协议) 1. 软硬件环境及红外解码状态图 2. 基于定 ...

  6. python密码登录程序三次_Python实现账号密码输错三次即锁定功能简单示例

    本文实例讲述了Python实现账号密码输错三次即锁定功能.分享给大家供大家参考,具体如下: 初学Python-1 #实现账号输错三次即锁定 user = "hubery" pass ...

  7. 【STM8】PWM 捕获实战:占空比和频率(TIM1)

    1. 前言 基于<[众拳STM8 40 讲]PWM 输入捕获原理与实验(频率)>我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法. 基于 ...

  8. 【STM8】PWM 捕获实战:占空比和频率(TIM2)

    1. 前言 基于<[众拳STM8 40 讲]PWM 输入捕获原理与实验(频率)>我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法. 基于 ...

  9. STM32使用I2C和PWM捕获读取MLX90615温度值

    一.MLX90615使用说明          MLX90615是一款红外温度传感器,默认使用SMBus模式,如果需要使用PWM模式则需要修改EEPROM地址中Config Register中的值才能 ...

最新文章

  1. Docker暴露端口服务器公网IP无法访问问题排查
  2. 经典问题——进程和线程区别
  3. PREDATOR: 低重叠三维点云的配准方法(CVPR2021)
  4. Ciruy英雄谭 Chapter 3 杂谈
  5. dynamic programming for knapsack with repeated items algorithm demonstration
  6. 工作192:vue项目如何刷新当前页面
  7. 通俗易懂的堆排序C++实现
  8. 数据增强_NLP 数据增强方法 EDA
  9. 牛人整理的统计学教材
  10. 【Java开发工具】下载安装eclipse并中文配置教程(所以操作系统通用)
  11. Python操作微信群发消息检测僵尸粉
  12. ckeditor使用技巧总结
  13. oracle加密表空间
  14. 机器学习基础:台大李宏毅的线性代数视频公开课
  15. 【机器学习】详解 TF-IDF 与 TF-IWF
  16. 【猴博士】概率论与数理统计 笔记总结(完结)
  17. Yapi接口平台个人总结
  18. 用python绘制叠加等边三角形_python 叠加等边三角形的绘制
  19. 关于扩展IP地址空间的几个方案的探讨
  20. matlab2020a安装完多大_Matlab2020a

热门文章

  1. 使用python处理实验数据-yechen_pro_20171231
  2. js中bind、call、apply函数的用法
  3. laravel框架cookie应用到中间件的理解
  4. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
  5. 工欲善其事必先利其器——web调试工具firebug
  6. 如何捕获window.print点击打印或取消_原来1:1的CAD图纸要这样打印!学了这么久才知道...
  7. python mk趋势检验_【C语言】MK趋势检验C语言代码
  8. python的unicode_python的unicode及其编码解码
  9. java课程设计总结迷宫_Java课程设计走迷宫详解.doc
  10. python了解一下_想要精通python?19个语法了解一下!