文章目录
一.概要
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用单片机数字输出(1或0)来对外部模拟电路进行控制的一种非常有效的技术。
在闭环控制系统中,通过实时监测PWM信号的频率变化,可以及时做出反馈调整,保证系统稳定工作。 对于外部输入的PWM信号,需要获取其精确的频率值来匹配内部PWM模块,实现精准同步或者解码其他信息。当PWM信号出现异常(如频率超出预设范围),可以通过输入捕获快速检测并采取相应的保护措施,所以研究PWM输入也有意义。
二.PWM输入框架图
定时器部分框图如下,其中PWM相关的主要是基本定时器和PWM输入控制部分。
PWM输入检测部分信号流向
该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:
● 两个ICx信号被映射至同一个TIx输入。
● 这2个ICx信号为边沿有效,但是极性相反。
● 其中一个TIxFP信号被作为触发输入信号,而从模式控制器被配置成复位模式。
如下图所示:
TI1为输入PWM波信号波形,TIMx_CNT为计数器计数值,当第一个下降沿信号到来,IC2会先进行捕获,然后到下一个上升沿到来,IC1进行捕获!在捕获的同时,IC1和IC2会把CNT的值映射到对应的CCR1、CCR2的寄存器里面,这个值就是我们需要的计数值!
那么我们所需测量的周期就是IC1捕获的值,脉冲宽度即为IC2测量的值。
三.CubeMX配置一个PWM输入例程
1.硬件准备
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。
2.创建工程
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置系统主频
配置TIM1,1ms定时器,TIM1内部时钟是72MHZ,72分频就是1MHZ,计数1000次归零,计数时间就是1ms,脉冲宽度是500us,根据上述配置,PWM波频率就是1KHZ,占空比就是50%。
配置定时器3通道2为PWM输入引脚,TI2FP2触发,CH2采样上升沿,CH1采样下降沿
定时器3中断使能
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
增加代码
主要代码
/* Duty Cycle Value */
__IO uint32_t TempDutyCycle = 0,DutyCycle;//占空比
/* Frequency Value */
__IO uint32_t TempFrequency = 0,Frequency;//频率
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
/* Get the Input Capture value */
TempDutyCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);//捕捉占空比
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
/* Get the Input Capture value */
TempFrequency = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);//捕捉周期
}
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_TIM_IC_CaptureCallback could be implemented in the user file
*/
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)//启动定时器通道1,PWM输出
{
/* PWM generation Error */
while(1);
}
if (HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2) != HAL_OK)//使能TIM3通道2捕捉
{
/* Starting Error */
while(1);
}
if (HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1) != HAL_OK)//使能TIM3通道1捕捉
{
/* Starting Error */
while(1);
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(1000);//等待1秒
if(TempFrequency!=0)
{
Frequency=1000000/TempFrequency;
DutyCycle=TempDutyCycle*100/TempFrequency;
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.调试
用杜邦线把板子的PA7和PA8连接起来,这样PA8引脚输出的PWM波,就能被PA7采集到。
进入调试模式,把Frequency跟DutyCycle放入到Watch窗口,就能看到PWM输入的信号的周期跟占空比
四.CubeMX工程源代码下载
链接:https://pan.baidu.com/s/1gq_kl9D9f6LEp5Ng4jZG4Q
提取码:ryf8
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
五.讲解视频链接地址
六.小结
PWM输入虽然没有PWM输出使用那么广泛,但通过PWM信号进行两个设备之间握手已经很普遍的使用,比如新能源充电枪之间握手等应用。
标签:CODE,HAL,TIM,STM32,单片机,源码,USER,PWM,输入 From: https://blog.csdn.net/zy2232652/article/details/140225724