PWM输入捕获PWM实验
所用芯片:STM32F407
库:HAL库
实验过程:
使用通用定时器2的输出通道1产生PWM波,使用高级定时器8的输入通道1来输入产生的PWM波,设置捕获通道1来测量周期,通道2来测量占空比,使用基本定时器6定时1s再通过串口1来输出测量值。
引脚设置:
高级定时器TIM8的通道1使用PC6
通用定时器TIM2的通道1使用PA15
基本定时器TIM6没有对应的外设引脚。
时钟设置:
TIM2和TIM6使用APB1 Timer clocks,时钟频率为84MHz
TIM8使用APB2 Timer clocks,时钟频率为168MHz
TIM2设置:
TIM2模式和配置
参数设置
中断设置
GPIO设置
TIM6设置:
TIM6模式和配置
参数设置
中断设置
TIM8设置:
TIM8模式和配置
参数设置
GPIO设置
默认设置即可。
系统核心设置:
在NVIC中可设置中断优先级
在RCC中可设置系统时钟源以及系统的相关参数
编写代码
timer2.c
/*
* @ name Timer1_Start_IT
* @ brief 定时器2以PWM模式启动
* @ param None
* @ retval None
*/
static void Timer2_Start_PWM(void) //定时器2以中断模式启动
{
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); //启动定时器2,通道1输出PWM
}
timer6.c
/*
* @ name Timer6_Start_IT
* @ brief 定时器6以中断模式启动
* @ param None
* @ retval None
*/
static void Timer6_Start_IT(void) //定时器6以中断模式启动
{
HAL_TIM_Base_Start_IT(&htim6); //启动定时器6
}
timer8.c
/*
* @ name Timer8_Start_Capture
* @ brief // 使能定时器8捕获/比较通道1/2的中断请求
* @ param None
* @ retval None
*/
static void Timer8_Start_Capture(void)
{
HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_2);
}
定时器6的中断处理函数
/*
* @ name HAL_TIM_PeriodElapsedCallback
* @ brief 定时器6中断回调函数
* @ param *htim -> 处理定时器的结构体指针
* @ retval None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim6.Instance)
{
// 每间隔 1s 测量值
if(++Timer6.usMCU_Run_Timer >= TIMER6_1s)
{
Timer6.usMCU_Run_Timer = 0;
printf("IC1Value = %d IC2Value = %d ", IC1Value, IC2Value);
printf("占空比:%0.2f%% 频率:%0.2fHz\n", DutyCycle, Frequency);
}
}
}
定时器8的中断处理函数
/*
* @ name HAL_TIM_IC_CaptureCallback
* @ brief 定时器8捕获回调函数
* @ param *htim -> 处理定时器的结构体指针
* @ retval None
*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
/* 获取输入捕获值 */
IC1Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_1);
IC2Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_2);
if (IC1Value != 0)
{
/* 占空比计算 百分数占空比是百分数,所以要乘以100. */
/* 因为IC1Value和IC2Value都是从0开始计数的,所以都要加1 */
DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
/* 频率计算 */
Frequency = 168000000/168/(float)(IC1Value+1);
}
else
{
DutyCycle = 0;
Frequency = 0;
}
}
}
对这三个定时器进行初始化
/*
* @name Peripheral_Set
* @brief 外设初始化设置
* @param None
* @retval None
*/
static void Peripheral_Set(void)
{
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); /*使能串口接收中断 */
Timer6.Timer6_Start_IT(); // 启动定时器6
Timer2.Timer2_Start_PWM(); // 启动定时器2,通道1输出PWM
Timer8.Timer8_Start_Capture(); // 使能定时器8捕获/比较通道1/2的中断请求
// TestSRAMWork();
printf("System Init Finish.\r\n");
}