STM32采用普通的IO口来测量PWM的频率

发布者:beup001最新更新时间:2018-07-01 来源: eefocus关键字:STM32  IO口  PWM  频率 手机看文章 扫描二维码
随时随地手机看文章

STM32测量外部输入信号的频率的方法有很多:


采用内部定时器输入捕获功能。

采用普通的IO口设置外部中断+定时器的当时测量PWM信号的频率。 


这两种方式比较推荐使用第一种,比较使用内部的资源可以节省CPU资源的利用, 

当然当内部资源不够使用的时候,或者是说,硬件电路设计的时候没有连接相应的应引脚只能使用第二种方式了。


本次由于硬件电路设计的不足,导致需要测量PWM输入信号的引脚没有接到相应的通道上,对此使用了第二种方式: 

注意:这里定时器中断的优先级要高于外部中断的优先级

思路如下:


设置PWM输入信号的引脚为外部中断的方式,并且触发方式为GPIO_MODE_IT_RISING_FALLING 上升,下降沿均可触发。

其次使能一个定时器TIM4,定时中断时间看自己需要测量频率来设置。(本次设置为2us –> 最大可测量的频率为50KHz)

外部中断中,上升沿到来,清空计数器TIM4->CNT=0,置一个上升沿的标志位为1,代表计算PWM时间的开始tim4_PWM_cnt++。

下降沿到来,置一个下降沿的标志为1.

下一次上升沿到来,判断上一次是否为下降沿的标志,如果是,则代表PWM一个周期的时间已经到达。读取时间。PWM_Cycle = timer4_PWM_cnt*2. 并且把计数变量清零tim4_PWM_cnt = 0

接着下一次下降沿到来,判断上一次是否为上升沿的标志,如果是,则代表一个周期高电平结束,读取时间,即为脉宽 PWM_Duty = timer4_PWM_cnt*2。 


具体c语言实现代码如下:

if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_11) != RESET)

{                           

    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);//调用中断处理公用函数  

    if(PWM_EN()==1)     //上升沿触发

    {

        TIM4->CNT=0;//这里清空TIM4计数。重新开始计数

        if((PWM_FLAG_DOWM==1)&&(PWM_FLAG_UP==2))//判断上一次是否为下降沿

        {

            PWM_Cycle = timer4_PWM_cnt*2;

            timer4_PWM_cnt=0;

        }

        PWM_FLAG_CNT = 1;


        PWM_FLAG_UP = 1;//上升沿标志

        PWM_FLAG_DOWM = 2;//上升沿标志

    }

    else//下降沿触发

    {

      if((PWM_FLAG_DOWM==2)&&(PWM_FLAG_UP == 1))//下降沿判断上一个状态是否为上升沿

      {

        PWM_Duty = timer4_PWM_cnt*2;

      }

     PWM_FLAG_DOWM=1;//下降沿标志

     PWM_FLAG_UP=2;//下降沿标志

}


void TIM4_Init(u16 arr,u16 psc)

{  

    TIM4_Handler.Instance=TIM4;                                 //通用定时器4

    TIM4_Handler.Init.Prescaler=psc;                            //分频系数

    TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;           //向上计数器

    TIM4_Handler.Init.Period=arr;                               //自动装载值

    TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频因子

    HAL_TIM_Base_Init(&TIM4_Handler);

    HAL_TIM_Base_Start_IT(&TIM4_Handler);//使能定时器4和定时器4更新中断:TIM_IT_UPDATE   

}


void TIM4_IRQHandler(void)

{

    HAL_TIM_IRQHandler(&TIM4_Handler);

    if(PWM_FLAG_CNT == 1)//PWM上升沿到来标志

    {

        timer4_PWM_cnt++;

    }

}


关键字:STM32  IO口  PWM  频率 引用地址:STM32采用普通的IO口来测量PWM的频率

上一篇:利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
下一篇:STM32学习笔记-PWM波形输出

推荐阅读最新更新时间:2024-03-16 16:07

STM32 GPIO——快速IO的使用
GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置'1'则端口x的对应位被清'0';寄存器中的位置'0',则对它对应的位不起作用。 GPIOx_BSRR的低16位中每一位也对应端口x的每个位,对低16位中的某位置'1'则它对应的端口位被置'1';寄存器中的位置'0',则对它对应的端口不起作用。 简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。另一个寄存器GPIOx_BRR只有低16位有效,与GPIOx_BSRR的高16位具有相同功能。 举个例子
[单片机]
STM32的FCLK , HCLK, PCLK
FCLK、HCLK、PCLK FCLK: 为CPU核供给时钟信号,我们所说的cpu主频为200MHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期 HCLK: 为AHB bus peripherals供给时钟信号,AHB为advanced high-performance bus PCLK: 为APB bus peripherals供给时钟信号,APB为advanced peripherals bus
[单片机]
采用DDS技术与AD8302芯片实现了数字化频率特性测试仪的设计
传统的频率特性测试仪不仅价格昂贵,且得不到相频特性,更不能保存频率特性图和打印频率特性图,也不能与计算机接口,给使用者带来了诸多不便。而本文采用DDS技术作为扫频信号源;同时采用了集成模拟芯片AD8302对幅度和相位进行检测,用DSP芯片TMS320VC5409和CPLD芯片EPM7128进行测量控制和数据处理,人杌接口部分是利用单片机AT89C51实现,并配有打印机接口和串行通信接口。 1 系统总体方案设计 频率特性测试系统一般包含测试信号源、被测网络、检波及显示3个部分。本系统根据所要完成的测试功能及技术指标,该系统应由扫频源、幅度相位测量电路、控制及运算部分、人机接口单元几部分组成。系统总体方框图如图1所示。 信号源
[单片机]
采用DDS技术与AD8302芯片实现了数字化<font color='red'>频率</font>特性测试仪的设计
stm32 pwm输出异常及解决过程
pwm输出是stm32最常用的外设之一,我比较习惯使用库函数配置,我通常移植做过的工程中的程序的配置代码,然后改一改相应的参数,配置方法也十分简单,即使很简单,但对于初学者有时候还是很容易出错。有时候会一点波形没有输出,在找不到其他原因的情况下,这个时候以自己以前的经验来说,配置代码里面有一句GPIO_PinAFConfig(GPIOB,GPIO_PinSource1, GPIO_AF_TIM3); (以stm32f4 time3 ch4为例)比较容易出错同时被忽略,其中的GPIO_PinSource1很容易稍不注意会写成GPIO_Pin_1这样子会导致引脚复用没有成功,同时输入捕获的配置的时候也有可能导致配置没有成功的情况,然
[单片机]
STM32按键扫描/按键中断/外部中断
接触STM32有一段时间了,也算是简单入了门,但由于一些原因,今天才来写本应该是入门级的按键相关程序,分为扫描模式和中断模式 MCU:STM32F334C8 1.扫描模式 首先配置按键引脚为上拉输入模式,根据原理图按键接PA0,按键没有按下的时候引脚输入为低电平0,按键按下输入高电平1,松开又回到低电平0 然后在死循环中不断读取相应引脚的输入状态,并根据返回结果判断按键是否按下,做出相应处理 下面的代码完成的功能是:按键第一次按下,点亮灯,再按一次,熄灭,重复。 #include Userkey.h u8 flag=0; void key_GPIO_Config(void) { GPIO_InitTypeDef GP
[单片机]
<font color='red'>STM32</font>按键扫描/按键中断/外部中断
单片机控制的PWM斩波式交流净化稳压电源
    摘要: 介绍了传统的正弦能量分配交流净化稳压电源的基本原理及如何用高频斩波和单片机技术对其进行改造。     关键词: 高频 斩波 交流稳压器 AVR 目前,在各种交流稳压电源中,采用正弦能量分配技术的交流净化稳压电源是一种技术先进的稳压电源。这种电源主要是通过改变晶闸管的触发角θ,来控制调感支路的等效电感,从而起到稳定输出电压的作用。它具有性价比高、可靠性好等特点。     但是这种方式产生的谐波较多,电感损耗较大,噪音明显,尤其对电网产生很大干扰。为此,笔者用高频PWM斩波技术对其进行改造,用M
[应用]
由浅入深尽享STM32标准库开发的乐趣
摘要:从STM32新建工程、编译下载程序出发,让新手由浅入深,尽享STM32标准库开发的乐趣。 自从CubeMX等图像配置软件的出现,同学们往往点几下鼠标就解决了单片机的配置问题。对于追求开发速度的业务场景下,使用快速配置软件是合理的,高效的,但对于学生的学习场景下,更为重要的是知其然并知其所以然。 以下是学习(包括但不限于)嵌入式的三个重要内容, 1、学会如何参考官方的手册和官方的代码来独立写自己的程序。 2、积累常用代码段,知道哪里的问题需要哪些代码处理。 3、跟随大佬步伐,一步一个脚印。 首先:我们都知道编程时一般查的是《参考手册》,而进行芯片选型或需要芯片数据时,查阅的是《数据手册》。此外市面上所有关于STM32的
[单片机]
由浅入深尽享<font color='red'>STM32</font>标准库开发的乐趣
FA5310开关电源控制IC及其应用
1引言 许多电子系统都需要开关电源。开关电源的电路多种多样,其中已有许多采用控制芯片。控制芯片只要再外接一些器件即可组成开关电源,从而大大简化了电路设计。 FA5310是日本富士电机公司的产品,它具有多种保护功能,外接电路简单,有很大的实用价值。FA5310具有以下特点: 可直接驱动功率MOSFET(I0=±1.5A);宽工作频率范围(5~600kHz);具有逐个脉冲过流限制功能;有过载切断功能(可选用锁定或无保护模式);可用外部信号控制输出ON/OFF;有过压切断功能(锁定模式中)和欠压误动作保护功能(16V时导通,8.7V时关断);等待电流低(90μA);占空比为Dmax=46%,可用于正激和反激电路。 图1为FA5310的
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved