实验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教程,即可获取下载链接。