10. GD32F103C8T6 定时器-测量pwm的占空比和频率
一、 利用TIM2的输入通道0,通道1测量pwm的占空比和频率
1. 配置gpio
void inpit_gpio_config(void)
{rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_AF);/*配置 PA6 配置为TIM2的CH0*/gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
}
2. 定时器基本初始化
static void trigger_time_base_init(int enable)
{/*定时器结构*/timer_parameter_struct timer_initpara;//开启定时器时钟rcu_periph_clock_enable(RCU_TIMER2);//结构体复位初始化timer_deinit(TIMER2);/* 初始化定时器结构体 */timer_struct_para_init(&timer_initpara);/* TIMER1 configuration */timer_initpara.prescaler = 108 - 1; //定时器的时钟频率是108MHztimer_initpara.alignedmode = TIMER_COUNTER_EDGE;//timer_initpara.counterdirection = TIMER_COUNTER_UP;//向上计数timer_initpara.period = 65535; //重载值timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //不分频timer_initpara.repetitioncounter = 0;//重复计数timer_init(TIMER2, &timer_initpara);if (enable)timer_enable(TIMER2);//使能定时器elsetimer_disable(TIMER2);
}
3. 配置pwm输入模式
计数器没来一个上升沿复位,计数器进入中断,记录当前值,这个值就是pwm周期值,pwm的下降沿也会进入一次中断,此时记录cnt值,此时的cnt值就是占空比的值
函数 **timer_input_pwm_capture_config()**内部初始化了2个通道,2个通道的触发边沿一个是上升沿一个是下降沿
void pwm_input_fre_duty_config()
{timer_ic_parameter_struct timer_icinitpara;/* 配置通道0为pwm输入模式*/timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;timer_icinitpara.icfilter = 0x0;timer_input_pwm_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);/* TIMER2 滤波后的输入 TI0*/timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_CI0FE0);//选择复位模式timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_RESTART);/* 使能主从模式*/timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE);/* 自动重载使能*/timer_auto_reload_shadow_enable(TIMER2);/* 清除中断标志*/timer_interrupt_flag_clear(TIMER2, TIMER_INT_CH0);/* 使能中断 */timer_interrupt_enable(TIMER2, TIMER_INT_CH0);nvic_irq_enable(TIMER2_IRQn, 1, 1);/* 开启定时器 */timer_enable(TIMER2);
}
4. 开启中断
void nvic_configuration(void)
{/* 1. 清除中断标志 */timer_interrupt_flag_clear(TIMER2, TIMER_INT_CH0);/* 使能定时器1的输入捕获中断*/timer_interrupt_enable(TIMER2, TIMER_INT_CH0);/*使能中断管理和优先级设置*/nvic_irq_enable(TIMER2_IRQn, 1, 1);}
5. 定时TIM2的中断处理函数
//方波下降沿cnt值
static uint32_t ic1value = 0;
//方波上升沿值
static uint32_t ic2value = 0;
//方波占空比
volatile uint16_t dutycycle = 0;
//方波频率
volatile uint16_t frequency = 0;
void TIMER2_IRQHandler(void)
{if (SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_CH0)){/* 清除中断标志*/timer_interrupt_flag_clear(TIMER2, TIMER_INT_CH0);/* 读取通道0捕捉寄存器值---也就是占空比 */ic1value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0) + 1;if (0 != ic1value){/* 读取通道1捕捉寄存器值---也就是占空比 */ic2value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_1) + 1;/* 计算占空比 */dutycycle = (ic2value * 100) / ic1value;/* 计算频率 */frequency = (float)1000000 / ic1value;}else{/* 复位数据 */dutycycle = 0;frequency = 0;}}}
总体初始化流程
/*测量pwm的占空比和频率*/
void pwm_test_pwm_duty_fre()
{inpit_gpio_config();trigger_time_base_init(1);nvic_configuration();pwm_input_fre_duty_config();}
二、利用TIM0 输出pwm,频率1K占空比不断变化
/*通道配置
*/
void gpio_config(void)
{//使能gpio时钟rcu_periph_clock_enable(RCU_GPIOA);//使能复用时钟rcu_periph_clock_enable(RCU_AF);/*配置gpio为复用上拉状态*/gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_11);}/*定时器的基本初始化和打开更新中断enable: 是否使能定时器
*/
void time_base_init(int enable)
{/*定时器结构*/timer_parameter_struct timer_initpara;//开启定时器时钟rcu_periph_clock_enable(RCU_TIMER0);//结构体复位初始化timer_deinit(TIMER0);/* 初始化定时器结构体 */timer_struct_para_init(&timer_initpara);/* TIMER1 configuration */timer_initpara.prescaler = 108 - 1; //定时器的时钟频率是108MHztimer_initpara.alignedmode = TIMER_COUNTER_EDGE;//timer_initpara.counterdirection = TIMER_COUNTER_UP;//向上计数timer_initpara.period = 1000 - 1; //重载值timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //不分频timer_initpara.repetitioncounter = 0;//重复计数timer_init(TIMER0, &timer_initpara);if (enable)timer_enable(TIMER0);//使能定时器elsetimer_disable(TIMER0);//失能定时器
}void pwm_outputconfig(int enable)
{//生成pwm:timer_oc_parameter_struct timer_ocintpara;/* CH1,CH2 and CH3 configuration in PWM mode1 */timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;//pwm 输出极性timer_ocintpara.outputstate = TIMER_CCX_ENABLE;//输出通道使能timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;//pwm互补输出极性timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;//输出通道失能timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;//pwm输出通道空闲电平timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;//pwm输出互补通道空闲电平//配置指定通带timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);timer_channel_output_config(TIMER0, TIMER_CH_3, &timer_ocintpara);/* CH0 50% */timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 500);timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);/* CH0 50% */timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, 500);timer_channel_output_mode_config(TIMER0, TIMER_CH_3, TIMER_OC_MODE_PWM0);timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE);//TIM0这句很重要,没有这句不输出pwm 如果不是高级定时器就不需要timer_primary_output_config(TIMER0, ENABLE);/* 自动重载使能 */timer_auto_reload_shadow_enable(TIMER0);/* 使能定时器 */if (enable)timer_enable(TIMER0);}
/*pwm输出控制函数
*/
void pwm_put_init(void)
{gpio_config();//gpio初始化/* 定时器的基本配置 */time_base_init(0);pwm_outputconfig(1);//定时器初始化
}
主函数调用
#include "gd32f10x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "string.h"
#include "bsp_uart.h"
#include "bsp_timer.h"
#include "gd32f103c_sys.h"#define LED0 PBout(13)
#define LED1 PBout(14)
#define LED2 PBout(15)
#define LED3 PAout(8)
int main(void)
{/* 配置系统时钟 */ systick_config();//设置中断分组nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);/* gpio时钟使能*/rcu_periph_clock_enable(RCU_GPIOB);//rcu_periph_clock_enable(RCU_GPIOA);// LED gpio 初始化gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);//gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8);//串口初始化usart_base_init();//定时器0 输出100Hz的方波pwm_put_init();//定时器T2检测占空比和频率pwm_test_pwm_duty_fre();int x=0;while(1){LED0=!LED0;delay_1ms(500);//打印占空比和频率printf("duty = %d fre = %d\r\n",dutycycle,frequency);/*改变pwm输出的占空比*/x= x+100>1000?0:x+100;timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_3,x);}
}
实验结果
10. GD32F103C8T6 定时器-测量pwm的占空比和频率相关推荐
- HAL库教程10:定时器的PWM模式应用
本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐.本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴 无源蜂鸣器驱动电路 蜂鸣器按照有无震荡源(不是电源),可以分为 ...
- io输出pwm且占空比和频率同时可调驱动实现
1.设计用户层传递方式 只需传递频率和占空比 参数范围:频率:1hz~1Mhz 占空比(高电平时间/周期):1-99 (代表1%~99%) 2.设计方式 思路手稿: 结论: ...
- STM32 定时器及PWM计算占空比计算周期
文使用Cubemx+MDK5开发方式(纯新手向 记录一下) 定时器时间计算 两步 (特别特别特别注意单位换算 简单无脑) 1MHZ = 1000KHZ 1KHZ = 1000HZ 1HZ 的周期是1秒 ...
- STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)
本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...
- STM32笔记——定时器输入捕获功能(测量PWM的频率和占空比)
目录 一.概述 二.输入捕获功能 2.1 输入捕获简介 2.2 输入捕获通道 三.输入捕获功能测量PWM波的频率和占空比 3.1 测量频率的方法 3.2 测量过程 一.概述 主要介绍通用定时器的输入捕 ...
- STM32测量PWM波频率及占空比
测量PWM波频率 PWM模式输入 基本原理 实验(PWM输入部分代码) 测量一段时间内脉冲个数求频率 PWM模式输入 该方式是在STM32输入捕获模式基础上扩展升级的功能,可以测量PWM波的频率及占空 ...
- GD32测量pwm波频率以及占空比
1.需求 最近做的一个项目,其中有一个传感器输出是pwm波形,频率代表速度,频率越高速度越快.不同的占空比代表不同的故障类型.占空比10%~90%,频率范围20hz ~1khz. 基于以上的需求,单片 ...
- 如何测量PWM波的占空比
占空比 一个频率波形有信号与无信号的比值叫占空比. 有占空比还要知道频率.眼睛能识别的频率为25HZ. 频率很高时,看不到闪烁,占空比越大,LED越亮: 频率很低时,可看到闪烁,占空比越大,LED越亮 ...
- STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期
STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期 目录 STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期 1.介绍 2.STM32C ...
最新文章
- Hotpatch潜在的安全风险
- python - 配置文件
- vmware如何安装solaris10
- 【Spring 5】响应式Web框架实战(下)
- C++类设计的一些心得
- MWC(2) Multiwii初学者详细准备
- Python ini文件读取(configparser模块)(转载)
- GridView.RowCommand 事件
- 部署Azkaban多节点分布式模式
- 测试网络速度的软件 哪款好,网络测速工具有哪些?2018网络测速工具推荐
- 基于Vue的电商后台管理系统(2)
- 计算机信息安全技术分为两个层次,李某将玉佩以合理价格转让给善意第三人朱某时,下列说法正确的是?()。...
- GeoTools入门(八)-- (SLD)样式处理
- Win10兼容性怎么设置详细的步骤
- 2022考研数学 张宇 基础班【配套张宇30讲】【免费分享】
- DELL T7600工作站重新安装WIN7系统
- 哔哩哔哩 BV、AV互转 C#版
- -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义
- 动态ip代理:保护ip地址,这五种方法请收好
- 二、赛普拉斯EZ-USB FX3示例烧录验证
热门文章
- serlvert jsp mysql_JSP课设之项目管理 - osc_xm8bu282的个人空间 - OSCHINA - 中文开源技术交流社区...
- opboot怎么刷入固件_矿渣高性价比竞斗云系列四:竞斗云最强刷机OPBOOT1.09+128M固件刷机...
- docker运行jar包_Jenkins+Docker+Springboot单机版持续集成部署
- windows使用WSL安装linux子系统
- Ndarry 拉伸为一个list
- python计算存款_python入门教程NO.8 用python写个存款利息计算器
- linux文件编码无法修改,在Linux系统中修改文本的字符编码的方法
- BZOJ.4909.[SDOI2017]龙与地下城(正态分布 中心极限定理 FFT Simpson积分)
- mybatis sql xml 字符逃脱
- 有向图的强连通分量,割点与桥