STM32CUBEMX_检测输入的PWM频率和脉宽

实验1:点亮LED

实验2:按键控制LED

实验3:外部中断检测按键

实验4:扩展芯片检测按键

实验5:定时器实现LED闪烁

实验6:基于PWM的呼吸灯

实验7:检测输入的PWM频率和脉宽

实验8:串口的输入和输出

实验9:串口使用PRINTF函数

实验10:SPI接口操作片外FLASH

实验11:SPI接口操作TF卡

实验12:IIC接口操作OLED屏幕

实验13:ADC电压采样

STM32的定时器除了能输出PWM,还能对输入的PWM进行检测。可以检测输入的PWM周期是多少,占空比是多少。本节我们实现这样一个实验,使用TIM3的通道1(PB4)输出一个PWM,然后通过杜邦线把这个PWM送入TIM2的通道2(PB3),使用STM32自带的PWM输入检测功能,识别该PWM的周期和占空比。

相应管脚如下:

步骤如下:

1、新建工程,进行基本配置。通过点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:

参照实验1,芯片选择“STM32F103C8”。

打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”。

选择调试接口,点击“System Core”,选择RCC。,在右侧弹出的菜单栏中选择“Serial Wire”。

2、配置TIM3,使其输出一个PWM,参数如下:

分频系数为71,PWM周期为80,占空比为40.

3、配置TIM2,使其能对输入的PWM进行检测,参数如下:

4、时钟配置。参照实验1.

5、参照实验1的步骤7,进行相应配置,生成工程文件。

6、修改工程。打开工程,主要修改main.c文件。位置1,定义几个变量,用来存储周期、占空比相关的值。

代码:

uint32_t duty = 0;
uint32_t freq = 0;
uint32_t tmp1 = 0, tmp2 = 0;

位置2,开启TIM3的通道1PWM输出,开启TIM2的PWM输入捕获,如图:

代码:

	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);

位置3,在主函数while(1)循环中,根据周期和脉宽,计算频率和占空比:

代码:

    if (tmp1 == 0)
    {
        duty = 0;
        freq = 0;
    }
    else
    {
        duty = tmp1 * 100 / tmp2;
        freq = 1000000 / tmp2;
    }
    HAL_Delay(500);

位置4,添加TIM2的PWM输入中断响应代码,如图:

代码:

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
        tmp1 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);//Õ¼¿Õ±È
    }
    else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    {
        tmp2 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);//ÖÜÆÚ
    }
}

修改后,保存,编译、下载,重新上电。使用杜邦线连接PB3和PB4,然后通过ST-LINK或者其它调试工具进入在线调试状态,查看tmp1和tmp2的值。

整个过程有PPT、数据手册、原理图、源码、相关软件,在公众号(单片机爱好者)回复关键词:002或者STM32CUBEMX教程,即可获取下载链接。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据