博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32CubeMX之定时器TIM
阅读量:144 次
发布时间:2019-02-27

本文共 2458 字,大约阅读时间需要 8 分钟。

基础(basic)定时器的配置

TIM6做基础定时中断

基础参数的配置

在这里插入图片描述

定时时间计算:
  所以定时器频率为 f = 72M / Prescaler / Period = 72000 000 / 7200 /5000 = 2Hz;
  定时时间T = 1 / f 则: 1s / 2Hz = 1000 000us / 2Hz = 500 000us =500ms。

NVIC中断配置

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128095929230.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyOTAwOTk2,size_16,color_FFFFFF,t_70

在这里插入图片描述

生成代码

1、在main函数中开启基础定时器TIM6的中断HAL_TIM_Base_Start_IT(&htim6);该函数一定要在初始化完成之后再开启

int main(void){
... /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_TIM6_Init(); /* Initialize interrupts */ MX_NVIC_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim6); printf("2020.11.28 \n"); while (1){
}}

2、在tim.c文件中实现中断函数

/* USER CODE BEGIN 1 */void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim == &htim6) {
printf("i am htim6-- \r\n"); }}/* USER CODE END 1 */

注意事项

我在2018年的使用STM32CubeMX测试基础定时器,将HAL_TIM_Base_Start_IT(&htim6);放在如下函数中,可正常使用。

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle){
if(tim_baseHandle->Instance==TIM6) {
/* USER CODE BEGIN TIM6_MspInit 0 */ /* USER CODE END TIM6_MspInit 0 */ /* TIM6 clock enable */ __HAL_RCC_TIM6_CLK_ENABLE(); /* USER CODE BEGIN TIM6_MspInit 1 */ HAL_TIM_Base_Start_IT(&htim6); /* USER CODE END TIM6_MspInit 1 */ }}

现在生成的代码,这样配置不正常,需要将HAL_TIM_Base_Start_IT(&htim6);放在main函数初始化之后,可能是STM32CubeMX的版本升级的原因吧。

通用定时器的配置

通用定时器TIM3输出PWM

基础参数的配置

在这里插入图片描述

定时周期计算:
  所以定时器频率为 f = 72M / Prescaler / Period = 72000 000 / 7200 /200 = 50Hz;
  定时时间T = 1 / f 则: 1s / 50Hz = 1000 000us / 50Hz = 20 000us =20ms。

生成代码

1、开启通道1的PWM

int main(void){
... /*系统其他的初始化*/ MX_TIM3_Init(); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); /*开启通道1的PWM*/ while (1) {
}}

产生的PWM

在这里插入图片描述
定时器TIM3的通道映射:
在这里插入图片描述
2、调节PWM的占空比
自定义函数,调节参数可以调节占空比,注意参数范围是0 ~ Counter Period 。

void TIM_SetTIM3Compare1(uint32_t compare){
TIM3->CCR1=compare; }int main(void){
... /*系统其他的初始化*/ MX_TIM3_Init(); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); /*开启通道1的PWM*/ TIM_SetTIM3Compare1(20); while (1) {
}}

产生的占空比

在这里插入图片描述

使用PWM控制舵机

舵机的控制:

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
小型舵机的工作电压一般为4.8V或6V,转速也不是很快,一般为0.22/60度或0.18/60度,所以假如你更改角度控制脉冲的宽度太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。要精确的控制舵机,其实没有那么容易,很多舵机的位置等级有1024个,那么,如果舵机的有效角度范围为180度的话,其控制的角度精度是可以达到180/1024度约0.18度了,从时间上看其实要求的脉宽控制精度为2000/1024us约2us。如果你拿了个舵机,连控制精度为1度都达不到的话,而且还看到舵机在发抖。在这种情况下,只要舵机的电压没有抖动,那抖动的就是你的控制脉冲了。而这个脉冲为什么会抖动呢?当然和你选用的脉冲发生器有关了。
如果PWM一直输出某个占空比,舵机会一直停留在某个位置。

转载地址:http://ljkb.baihongyu.com/

你可能感兴趣的文章