一、 利用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输入模式

  1. 计数器没来一个上升沿复位,计数器进入中断,记录当前值,这个值就是pwm周期值,pwm的下降沿也会进入一次中断,此时记录cnt值,此时的cnt值就是占空比的值

  2. 函数 **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的占空比和频率相关推荐

  1. HAL库教程10:定时器的PWM模式应用

      本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐.本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴 无源蜂鸣器驱动电路   蜂鸣器按照有无震荡源(不是电源),可以分为 ...

  2. io输出pwm且占空比和频率同时可调驱动实现

    1.设计用户层传递方式 只需传递频率和占空比 参数范围:频率:1hz~1Mhz   占空比(高电平时间/周期):1-99  (代表1%~99%) 2.设计方式 思路手稿:           结论: ...

  3. STM32 定时器及PWM计算占空比计算周期

    文使用Cubemx+MDK5开发方式(纯新手向 记录一下) 定时器时间计算 两步 (特别特别特别注意单位换算 简单无脑) 1MHZ = 1000KHZ 1KHZ = 1000HZ 1HZ 的周期是1秒 ...

  4. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...

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

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

  6. STM32测量PWM波频率及占空比

    测量PWM波频率 PWM模式输入 基本原理 实验(PWM输入部分代码) 测量一段时间内脉冲个数求频率 PWM模式输入 该方式是在STM32输入捕获模式基础上扩展升级的功能,可以测量PWM波的频率及占空 ...

  7. GD32测量pwm波频率以及占空比

    1.需求 最近做的一个项目,其中有一个传感器输出是pwm波形,频率代表速度,频率越高速度越快.不同的占空比代表不同的故障类型.占空比10%~90%,频率范围20hz ~1khz. 基于以上的需求,单片 ...

  8. 如何测量PWM波的占空比

    占空比 一个频率波形有信号与无信号的比值叫占空比. 有占空比还要知道频率.眼睛能识别的频率为25HZ. 频率很高时,看不到闪烁,占空比越大,LED越亮: 频率很低时,可看到闪烁,占空比越大,LED越亮 ...

  9. STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

    STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期 目录 STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期 1.介绍 2.STM32C ...

最新文章

  1. Hotpatch潜在的安全风险
  2. python - 配置文件
  3. vmware如何安装solaris10
  4. 【Spring 5】响应式Web框架实战(下)
  5. C++类设计的一些心得
  6. MWC(2) Multiwii初学者详细准备
  7. Python ini文件读取(configparser模块)(转载)
  8. GridView.RowCommand 事件
  9. 部署Azkaban多节点分布式模式
  10. 测试网络速度的软件 哪款好,网络测速工具有哪些?2018网络测速工具推荐
  11. 基于Vue的电商后台管理系统(2)
  12. 计算机信息安全技术分为两个层次,李某将玉佩以合理价格转让给善意第三人朱某时,下列说法正确的是?()。...
  13. GeoTools入门(八)-- (SLD)样式处理
  14. Win10兼容性怎么设置详细的步骤
  15. 2022考研数学 张宇 基础班【配套张宇30讲】【免费分享】
  16. DELL T7600工作站重新安装WIN7系统
  17. 哔哩哔哩 BV、AV互转 C#版
  18. -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义
  19. 动态ip代理:保护ip地址,这五种方法请收好
  20. 二、赛普拉斯EZ-USB FX3示例烧录验证

热门文章

  1. serlvert jsp mysql_JSP课设之项目管理 - osc_xm8bu282的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. opboot怎么刷入固件_矿渣高性价比竞斗云系列四:竞斗云最强刷机OPBOOT1.09+128M固件刷机...
  3. docker运行jar包_Jenkins+Docker+Springboot单机版持续集成部署
  4. windows使用WSL安装linux子系统
  5. Ndarry 拉伸为一个list
  6. python计算存款_python入门教程NO.8 用python写个存款利息计算器
  7. linux文件编码无法修改,在Linux系统中修改文本的字符编码的方法
  8. BZOJ.4909.[SDOI2017]龙与地下城(正态分布 中心极限定理 FFT Simpson积分)
  9. mybatis sql xml 字符逃脱
  10. 有向图的强连通分量,割点与桥