实验的基本原理:


利用通用定时器产生4路占空比不同的PWM波形(频率100k,占空比0.5 0.4 0.3 0.2);

利用高级定时器的PWM输入模式来测量PWM参数;

有几个值得注意的地方:


捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1;

计数周期不能设置的太小,如果我们设置的计数周期 < PWM周期,那么就无法捕获PWM脉冲,一般驱动电机的PWM是10k ~ 25kHz,当设置的周期为1ms,对应频率为1kHz,那么就可以捕获1kHz以上的PWM 信号;

下面是测量pwm的代码:


bsp_AdvanceTim.c


#include "bsp_AdvanceTim.h" 

 

static void ADVANCE_TIM_NVIC_Config(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; 

    // 设置中断组为0

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

// 设置中断来源

    NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_TIM_IRQ;

// 设置抢占优先级

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

  // 设置子优先级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

 

static void ADVANCE_TIM_GPIO_Config(void) 

{

   GPIO_InitTypeDef GPIO_InitStructure;

 

RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

  GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);

}

 

static void ADVANCE_TIM_Mode_Config(void)

{

  // 开启定时器时钟,即内部时钟CK_INT=72M

ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);

 

/*--------------------时基结构体初始化-------------------------*/

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断

TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;

// 驱动CNT计数器的时钟 = Fck_int/(psc+1)

TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC;

// 时钟分频因子 ,配置死区时间时需要用到

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

// 计数器计数模式,设置为向上计数

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

// 重复计数器的值,没用到不用管

TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

// 初始化定时器

TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);

 

/*--------------------输入捕获结构体初始化-------------------*/

  // 使用PWM输入模式时,需要占用两个捕获寄存器,一个测周期,另外一个测占空比

TIM_ICInitTypeDef  TIM_ICInitStructure;

// 捕获通道IC1配置

// 选择捕获通道

  TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL;

// 设置捕获的边沿

  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

// 设置捕获通道的信号来自于哪个输入通道,有直连和非直连两种

  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

// 1分频,即捕获信号的每个有效边沿都捕获

  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

// 不滤波

  TIM_ICInitStructure.TIM_ICFilter = 0x0;

// 初始化PWM输入模式

  TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);

// 当工作做PWM输入模式时,只需要设置触发信号的那一路即可(用于测量周期)

// 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置

// 捕获通道IC2配置

// TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL;

//  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

//  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;

//  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

//  TIM_ICInitStructure.TIM_ICFilter = 0x0;

//  TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);

// 选择输入捕获的触发信号,触发的那一路信号对应的就是周期

  TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1);

 

// 选择从模式: 复位模式

// PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位

  TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset);

  TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable); 

 

  // 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)

  TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE);

// 清除中断标志位

TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);

// 使能高级控制定时器,计数器开始计数

  TIM_Cmd(ADVANCE_TIM, ENABLE);

}

 

void ADVANCE_TIM_Init(void)

{

ADVANCE_TIM_NVIC_Config();

ADVANCE_TIM_GPIO_Config();

ADVANCE_TIM_Mode_Config();

}

 

/*********************************************END OF FILE**********************/

bsp_AdvanceTim.h


#ifndef __BSP_ADVANCETIM_H

#define __BSP_ADVANCETIM_H

 

 

#include "stm32f10x.h"

 

/************高级定时器TIM参数定义,只限TIM1和TIM8************/

// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意

// 这里我们使用高级控制定时器TIM1

 

#define            ADVANCE_TIM                   TIM1

#define            ADVANCE_TIM_APBxClock_FUN     RCC_APB2PeriphClockCmd

#define            ADVANCE_TIM_CLK               RCC_APB2Periph_TIM1

 

// 输入捕获能捕获到的最小的频率为 72M/{ (ARR+1)*(PSC+1) }

/* 注意,这里的计数周期不能设置的太小,如果我们设置的计数周期 < PWM周期

那么就无法捕获PWM脉冲,一般驱动电机的PWM是10k ~ 25kHz,我们设置的

周期为1ms,对应频率为1kHz,那么就可以捕获1kHz以上的PWM 信号*/

#define            ADVANCE_TIM_PERIOD            (1000-1)

#define            ADVANCE_TIM_PSC               (72-1)

 

// 中断相关宏定义

#define            ADVANCE_TIM_IRQ               TIM1_CC_IRQn

#define            ADVANCE_TIM_IRQHandler        TIM1_CC_IRQHandler

 

// TIM1 输入捕获通道1

#define            ADVANCE_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOA

#define            ADVANCE_TIM_CH1_PORT          GPIOA

#define            ADVANCE_TIM_CH1_PIN           GPIO_Pin_8

 

#define            ADVANCE_TIM_IC1PWM_CHANNEL    TIM_Channel_1

#define            ADVANCE_TIM_IC2PWM_CHANNEL    TIM_Channel_2

 

 

/**************************函数声明********************************/

 

void ADVANCE_TIM_Init(void);

 

 

#endif /* __BSP_ADVANCETIM_H */

然后在中断服务函数中读取CCR1 和 CCR2寄存器的值,并计算 频率 和 占空比。


__IO uint16_t IC2Value = 0;

__IO uint16_t IC1Value = 0;

__IO float DutyCycle = 0;

__IO float Frequency = 0;

/*

 * 如果是第一个上升沿中断,计数器会被复位,锁存到CCR1寄存器的值是0,CCR2寄存器的值也是0

 * 无法计算频率和占空比。当第二次上升沿到来的时候,CCR1和CCR2捕获到的才是有效的值。其中

 * CCR1对应的是周期,CCR2对应的是占空比。

 */

void ADVANCE_TIM_IRQHandler(void)

{

  /* 清除中断标志位 */

  TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);

 

  /* 获取输入捕获值 */

  IC1Value = TIM_GetCapture1(ADVANCE_TIM);

  IC2Value = TIM_GetCapture2(ADVANCE_TIM);

  // 注意:捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1

if (IC1Value != 0)

  {

    /* 占空比计算 */

    DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value + 1);

 

    /* 频率计算 */

    Frequency = (72000000/(ADVANCE_TIM_PSC+1))/(float)(IC1Value + 1);

printf("占空比:%0.2f%%   频率:%0.2fHzn",DutyCycle,Frequency);

  }

  else

  {

    DutyCycle = 0;

    Frequency = 0;

  }

}


实际测试效果如下:

关键字:stm32  PWM  频率  占空比 引用地址:stm32专题二十六:测量PWM 频率 + 占空比

上一篇:stm32专题二十六:输入捕获 脉宽测量
下一篇:stm32专题二十七:MPU6050介绍

推荐阅读

    新浪科技讯 北京时间10月27日凌晨消息,据彭博社报道,三星正在为向市场推出可折叠智能手机而努力。据报道,随着该款手机接近研发的最后阶段,三星正在与谷歌合作,为该手机定制一个安卓(Android)版本。  用户交互界面最终版本将从三星已有的两个原型中产生。据彭博社报道,该款折叠手机代号为“Winner”,三星公司目前有两种设计方案:一种...
1、天然气流量计精度高,压力损失小,始动流量低,对温度压力和流量进行自动跟踪补偿,电池供电,可输出多种信号,选用进口轴承,寿命长,安装维修方便。智能型速度式流量仪表是集流量、温度、压力检测功能于一体,并能进行温度、压力补偿,具有准确度高、重复性好、测量范围宽、安装使用方便等优点。2、天然气流量计是一种测量封闭管道中气体介质流量的速...
10月28日消息,据国外媒体报道,自动驾驶技术研发商comma.ai的创始人乔治·霍茨(George Hotz)认为,电动汽车制造商特斯拉应该出售其自动驾驶芯片,与半导体厂商英伟达形成竞争。目前,特斯拉正在开发自己的自动驾驶芯片。该公司完全可以凭借其领先的自动驾驶技术,进入到自动驾驶出行领域。据悉,从2019年3月开始,该公司在每一辆新下线的Model S/X/3/...
自从2017年开始,瑞萨电子便开启了买买买的海外扩张路线,以平均每两年一家公司的速度,先后收购了包括Intersil与IDT在内的美国公司以及英国公司Dialog。随着如今对于Dialog的收购完成,新瑞萨将如何扩张?如何继续补充“成功产品组合”?日前,借瑞萨TechDay之际,瑞萨电子中国总裁赖长青、瑞萨电子中国物联网及基础设施事业本部应用技术部高级经理詹仁雄...

史海拾趣

问答坊 | AI 解惑

单片机应用实例下载

基于8051单片机的频率测量技术 公交车线路微机监控系统的设计与实现 基于单片机的电热水器定时控制器设计 单片机控制实时时钟X1226的应用设计 可控数字语音延迟器的PIC设计 用51兼容芯片PL3200设计直序扩频平台…

查看全部问答∨

发一个关于pid算法比较精要的教程

本帖最后由 paulhyde 于 2014-9-15 03:09 编辑 希望有所帮助啦  …

查看全部问答∨

如何使WINCE支持 128M Flash K9F1G08?

按照PB5默认设置编译出来的内核好像只支持页面大小512的FLASH 我用的NANDFLASH K9F1G08是128M的,看到网上说这块FLASH页面大小是2K。 结果我编译的内核下到板子里面就运行不了,只能用光盘里面NK_A70_128M.bin 在NANDFLASH驱动里面的代码FMD.cpp ...…

查看全部问答∨

wince,C#绘制文字,在线等

如题,我想写一个自定义控件,绘制一些文字,但是无法获得Graphics对象绘图所需的brush对象 请问如何创建这个brush对象…

查看全部问答∨

有一个MSP430单片机完整电路,想再加个功能,就是外围电路在不工作的时候,不给它们提供电压,只在工作的时候才给它们电压。该怎么设计一个电路实现这样的要求?请高

我由一个功能比较完整的电路,为了节省电源,想加个电源管理的电路,对单片机的外围电路进行管理,在外围电路工作的时候,给外围电路提供电压,不工作的时候,不给它们提供电压。不过其中有个DS1302时钟芯片,我觉得它不能断电吧?它断电了,是不是 ...…

查看全部问答∨

ADS1274问题

最近使用stm32f103微控制器控制ADS1274进行模拟信号采集,这个AD是给时钟就会采集吗。我使用stm32的SPI口对AD进行数据读取,读不到数据啊,当给AD的DIN输入数据时可以从SPI口读到数据,这能证明我的硬件是好的吗?有没有用过该AD的大神,给点调试建 ...…

查看全部问答∨

MSP430教程8:MSP430单片机复位电路

MSP430 单片机系统复位电路 从上MSP430系统复位电路功能模块图中可以看到了两个复位信号,一个是上电复位信号POR(Power On Reset)和上电清除信号PUC(Power Up Clear)。 POR信号是器件的复位信号,此信号只有在以下的事件发生时才会产生: 器件 ...…

查看全部问答∨

提问+MSP430G2553的时钟输出求解

刚接触430,看到好多时钟,和51不同,想用示波器观察下,怎么输出呢?…

查看全部问答∨

【紧急求助】基于MSP430G2553的简易信号发生器克隆

跪求在线等答案啊!~ 想照猫画虎仿造别人用完完全全一样的器材制作一个信号发生器。 别人大神做的东西在这里http://wenku.baidu.com/link?url=9pkjMsVgoc8TRPuw6v5YK7NC5NTPImcgi93xAHqgsWWQ9yl5qvSR-_B8ntcsvxo2PDpKCb_4kRciMyQkkwNKWB-lDu5NtfG ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved