W600 PWM 捕获功能使用示例程序
使用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 捕获功能使用示例程序相关推荐
- W600 PWM捕获功能
之前理解过,可是因为没有实践所以不够深刻,现在问了下同事就又想起来了,这里记录一下: PWM捕获有两个相关的寄存器,分别存放pwm输入口所输入的波形的高电平持续时间和低电平持续时间, 每来一个周期,数 ...
- ASP.NET AJAX示例程序:实现IDragSource和IDropTarget接口将商品拖放至购物车中
本文来自<ASP.NET AJAX程序设计--第II卷:客户端Microsoft AJAX Library相关>第9章第3节. 9.3 示例程序:实现IDragSource和IDropTa ...
- STM32笔记——定时器输入捕获功能(测量PWM的频率和占空比)
目录 一.概述 二.输入捕获功能 2.1 输入捕获简介 2.2 输入捕获通道 三.输入捕获功能测量PWM波的频率和占空比 3.1 测量频率的方法 3.2 测量过程 一.概述 主要介绍通用定时器的输入捕 ...
- 【CH559L单片机】PWM功能和示例介绍
[CH559L单片机]PWM功能和示例介绍 ✨在官方CH559单片机手册中,在定时器(Timer)这一章节介绍PWM.
- 基于定时器捕获功能的红外解码程序(NEC协议)
文章目录 前言 一.红外协议简介 1. ITT Protocol 2. NEC 协议 3. Nokia NRC17 协议 二.红外解码程序(NEC协议) 1. 软硬件环境及红外解码状态图 2. 基于定 ...
- python密码登录程序三次_Python实现账号密码输错三次即锁定功能简单示例
本文实例讲述了Python实现账号密码输错三次即锁定功能.分享给大家供大家参考,具体如下: 初学Python-1 #实现账号输错三次即锁定 user = "hubery" pass ...
- 【STM8】PWM 捕获实战:占空比和频率(TIM1)
1. 前言 基于<[众拳STM8 40 讲]PWM 输入捕获原理与实验(频率)>我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法. 基于 ...
- 【STM8】PWM 捕获实战:占空比和频率(TIM2)
1. 前言 基于<[众拳STM8 40 讲]PWM 输入捕获原理与实验(频率)>我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法. 基于 ...
- STM32使用I2C和PWM捕获读取MLX90615温度值
一.MLX90615使用说明 MLX90615是一款红外温度传感器,默认使用SMBus模式,如果需要使用PWM模式则需要修改EEPROM地址中Config Register中的值才能 ...
最新文章
- Docker暴露端口服务器公网IP无法访问问题排查
- 经典问题——进程和线程区别
- PREDATOR: 低重叠三维点云的配准方法(CVPR2021)
- Ciruy英雄谭 Chapter 3 杂谈
- dynamic programming for knapsack with repeated items algorithm demonstration
- 工作192:vue项目如何刷新当前页面
- 通俗易懂的堆排序C++实现
- 数据增强_NLP 数据增强方法 EDA
- 牛人整理的统计学教材
- 【Java开发工具】下载安装eclipse并中文配置教程(所以操作系统通用)
- Python操作微信群发消息检测僵尸粉
- ckeditor使用技巧总结
- oracle加密表空间
- 机器学习基础:台大李宏毅的线性代数视频公开课
- 【机器学习】详解 TF-IDF 与 TF-IWF
- 【猴博士】概率论与数理统计 笔记总结(完结)
- Yapi接口平台个人总结
- 用python绘制叠加等边三角形_python 叠加等边三角形的绘制
- 关于扩展IP地址空间的几个方案的探讨
- matlab2020a安装完多大_Matlab2020a
热门文章
- 使用python处理实验数据-yechen_pro_20171231
- js中bind、call、apply函数的用法
- laravel框架cookie应用到中间件的理解
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
- 工欲善其事必先利其器——web调试工具firebug
- 如何捕获window.print点击打印或取消_原来1:1的CAD图纸要这样打印!学了这么久才知道...
- python mk趋势检验_【C语言】MK趋势检验C语言代码
- python的unicode_python的unicode及其编码解码
- java课程设计总结迷宫_Java课程设计走迷宫详解.doc
- python了解一下_想要精通python?19个语法了解一下!