HAL库配置基本定时器功能
TIM7初始化代码CubeMX都帮我们配置好了,我们只需要修改主函数代码即可
main.c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM7_Init();
HAL_TIM_Base_Start_IT(&htim7);
while (1)
{
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);
}
PWM输入捕获
概念理解
输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。
与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2FP2它们中的一个被选择为触发输入且从模式控制器被配置为复位模式。
1、每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。
2、同一个TIx输入映射了两个ICx信号。
3、这两个ICx信号分别在相反的极性边沿有效。
4、两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5、当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6、同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)
7、由此可以计算出PWM的时钟周期和占空比了
frequency=f(TIM时钟频率)/n。 duty cycle=(高电平计数个数/n), 若m为高电平计数个数,则duty cycle=m/n 若m为低电平计数个数,则duty cycle=(n-m)/n
PWM输出配置
PWM输入捕获配置
初始化配置代码CubeMX都帮我们配置好了,我们只需要修改TIM8的中断回调函数以及主函数
中断回调函数
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)
{
DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
Frequency = 168000000/168/(float)(IC1Value+1);
}
else
{
DutyCycle = 0;
Frequency = 0;
}
}
}
main.c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM4_Init();
MX_TIM8_Init();
MX_USART1_UART_Init();
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_2);
while (1)
{
HAL_Delay(500);
printf("IC1Value = %d IC2Value = %d ",IC1Value,IC2Value);
printf("占空比:%0.2f%% 频率:%0.2fHzn",DutyCycle,Frequency);
}
}
实验结果
TIM8输出四路PWM-------输出比较,后续电机控制中需要用到
初始化配置代码CubeMX都帮我们配置好了,我们只需要修改TIM8的比较中断回调函数以及主函数
中断回调函数
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
__IO uint16_t count;
count = __HAL_TIM_GET_COUNTER(htim);
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, count + 25);
}
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, count + 51);
}
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
{
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, count + 77);
}
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
{
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_4, count + 103);
}
}
main.c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM8_Init();
MX_USART1_UART_Init();
HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_2);
HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_3);
HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_4);
TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_1, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_2, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_3, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_4, TIM_CCx_ENABLE);
while (1)
{
}
}
实验结果可以用示波器进行测量
刚做完PWM输出实验,这里做一个记录,感谢大家的阅读!!!^_^



