【STM32】通用定时器TIM2-TIM5中断配置方式+继电器控制

简介: 【STM32】通用定时器TIM2-TIM5中断配置方式+继电器控制
+关注继续查看

继电器是我们生活中常用的一种控制设备,通俗的意义上来说就是开关,在条件满足的情况下关闭或者开启。继电器的开关特性在很多控制系统尤其是离散的控制系统中得到广泛的应用。从另一个角度来说,由于为某一个用途设计使用的电子电路,最终或多或少都需要和一些机械设备相交互所以继电器也起到电子设备和机械设备的接口作用。


继电器驱动原理图 

97c2d8410ed46c205dc4c4dadb3432af_c2302c51151e49f6a08e03378c6ff9cd.png

线圈不分正负极

D1是肖特基二极管(正向导通,反向截止)

三极管截止时,D1才慢慢消除线圈里存留的电,D1起到保护三极管作用

R1是限流电阻

三极管NPN型,PF0输出高电平,继电器工作

如果三极管是PNP型,单片机引脚输出低电平,继电器就工作了

继电器接线方式:

36ff04618de51f0ca718e1e7b7f92610_5fce989d1dea479fbf2edb0e5e2305dd.png


 今日任务:复习TIM1,学习通用定时器

TIM2、TIM3、TIM4、TIM5配置方式都是相同的

开始编写代码!

1. //宏定义,方便后期代码移植
2. #define RELAY_PORT   GPIOF
3. #define RELAY        GPIO_Pin_0

编写继电器控制函数

重装载值预分频值拿出来做形参,方便修改,取值范围都是0~65535

具体配置过程参考代码的注释

1. // 0-65535
2. void RELAY_Config(uint16_t Period, uint16_t Prescaler)
3. {
4.  //先开时钟
5.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
6.  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,  ENABLE);   //TIM2在APB1总线
7. 
8.  GPIO_InitTypeDef GPIO_InitStructure;
9.  TIM_TimeBaseInitTypeDef TIM_InitStructure;
10.     NVIC_InitTypeDef NVIC_InitStructure;
11. 
12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //配置推挽输出
13.     GPIO_InitStructure.GPIO_Pin = RELAY;
14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
15.     GPIO_Init(RELAY_PORT, &GPIO_InitStructure);
16. 
17.     //继电器输入一个高电平信号是工作状态,所以先初始化低电平
18.     GPIO_ResetBits (RELAY_PORT, RELAY); //LOW
19. 
20.     TIM_InitStructure.TIM_Period    = Period;   //重装载值
21.     TIM_InitStructure.TIM_Prescaler = Prescaler;    //预分频值
22.     TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割无
23.     TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
24.     TIM_InitStructure.TIM_RepetitionCounter = DISABLE;  //先禁用 重复计数次数
25.     TIM_TimeBaseInit(TIM2, &TIM_InitStructure); //初始化
26. 
27.     //开中断之前,先清空中断!!!
28.     TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
29. 
30.     //开启中断,要或 | 上触发中断源TIM_IT_Trigger
31.     TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_Trigger, ENABLE);
32.     TIM_Cmd(TIM2, ENABLE);
33. 
34.     //中断优先级分组,先随意,因为没有多个中断同时触发
35.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
36.     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //中断源
37.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
38.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占
39.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应
40.     NVIC_Init(&NVIC_InitStructure);
41. 
42. }

定时器2的中断服务函数

1. void TIM2_IRQHandler(void)
2. {
3.  if (TIM_GetITStatus (TIM2, TIM_IT_Update) == SET)   //判断TIM_GetITStatus == 1 判断是否进入中断
4.  {
5.      //写位操作      //SET - GPIO_ReadOutputDataBit  1-读取到的输出状态位,就是取非操作
6.      GPIO_WriteBit (RELAY_PORT, RELAY, (BitAction)(SET - GPIO_ReadOutputDataBit(RELAY_PORT, RELAY) ) );
7.      TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清空中断
8.  }
9. }

main函数

1. int main(void)
2. {
3.  RELAY_Config (2000-1, 7200-1);//人工减1,系统加1
4. 
5.  //每次中断都翻转电平,200ms翻转一次,周期就是400ms
6.  while(1)
7.  {       
8.  }
9. }

RELAY_Config(2000-1, 7200-1);函数形参讲解:

没有进行时钟分割,就是72MHz,1S计72M个数

现在进行7200分频,相当于1s计数72M/7200 = 10000,就是一秒要计一万个数

计数一次就是 1/10000 = 0.0001 = 100us

如果定时200ms,重装载值 = 0.2s*10000 = 2000,计数2000 = 0.2s = 200ms    

最后用逻辑分析仪抓取一下波形,观察实验现象,200ms高电平,200ms低电平,占空比50%

没得问题!!!

a7c42573ece89b174552c2097b9fd61b_259c45303377431fa0e4a33efb3e45a5.png

 这个波形,不是PWM,是手动设置的一个周期的波形频率……


相关文章
|
3月前
|
缓存 程序员 内存技术
STM32定时器配置(TIM1-TIM8)高级定时器+普通定时器,定时计数模式下总结
STM32定时器配置(TIM1-TIM8)高级定时器+普通定时器,定时计数模式下总结
181 0
|
3月前
|
存储 编译器 调度
STM32滴答定时器SysTick精准延时,兼容HAL库和标准库
STM32滴答定时器SysTick精准延时,兼容HAL库和标准库
196 0
|
4月前
STM32定时器SysTick实现的延时函数
STM32定时器SysTick实现的延时函数
39 0
|
4月前
【STM32】基本定时器TIM6&TIM7自定义时长
【STM32】基本定时器TIM6&TIM7自定义时长
|
4月前
【STM32】高级定时器TIM1计数中断配置
【STM32】高级定时器TIM1计数中断配置
237 0
|
5月前
|
芯片
stm32使用cubeMX配置TIM定时器让LED灯闪烁
stm32使用cubeMX配置TIM定时器让LED灯闪烁
60 0
|
5月前
【蓝桥杯嵌入式】STM32定时器的配置,解析预分频系数和重装载值与时钟频率的关系
【蓝桥杯嵌入式】STM32定时器的配置,解析预分频系数和重装载值与时钟频率的关系
|
5月前
STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)
原理:当捕捉到信号的跳变沿时,将CNT的值所存到捕获寄存器CCR中,然后把两次的值相减,就可以得到脉宽或者频率。
183 0
|
5月前
STM32学习笔记(3) TIM基本定时器
代码中有这样一条,有人会问函数TIM_ClearFlag()和函数TIM_ClearITPendingBit()有什么区别?其实重点在Flag和IT,前者是外设的状态标志,而后者是外设的中断标志。状态标志就是一个外设它有自身的一些标志位(Flag),来表明它处于什么状态,下图就是定时器的状态标记。中断标志就是使能外设的中断后,每次发生一次中断,它会表明发生了什么样的中断,同样中断也有相应的标记。两者分别靠函数TIM_GetFlagStatus()和函数TIM_GetITStatus()来获取
91 0
推荐文章
更多