你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G4 ---模块配置---TIM_Output_Compare(2)

[复制链接]
STMCU小助手 发布时间:2022-7-7 16:00
前言
定时器输出比较模式(翻转模式)。
对于输出PWM波,在十一届考了个输出不同频率的可调占空比的PWM波。
对于此,用新板子的话可以采用TIM3、TIM17输出。(建议用新板子准备此题仍然用输出比较模式)
但是考点并不在这,考的是定时器的输出比较模式。

输出不同频率100Hz、200Hz可调占空比的PWM波
1.取计数周期为100的定时器(计数值从0到100- 1循环),频率设为100Hz = 80MHz/100/8000。
记输出PWM1,计数周期为T1 = 100,f = 100Hz=80MHz/100/8000。
记输出PWM2,计数周期为T2 = 50,f = 200Hz=80MHz/50/8000。
则令初始值TIMx_CCR1 = T1 * PA6_Duty/100 ,TIMx_CCR2 = T2 * PA7_Duty/100 。(Duty是0-100的数)
当发生中断时,
若是通道1,
则将比较值CCR1 += T1PA6_Duty/100 ;CCR1 %= TIMx_Period;
下一次CCR1 += T1(1 - PA6_Duty/100);CCR1 %= TIMx_Period;以此循环
若是通道2,
则将比较值CCR2 += T2PA7_Duty/100 ;CCR2 %= TIMx_Period;
下一次CCR2 += T2(1 - PA7_Duty/100);CCR2 %= TIMx_Period;以此循环

(如果读者还是不能理解,可以画个波形看看哦)

2.Cubemx实现TIM的配置
由于在做这个实验的时候身边没有示波器,所以采用上升沿和下降沿个数来判断是否成功。
所以我们采用了串口(9600)和LCD帮助测试
TIM3配置如下:

_[]VW37_SB{2UPMT}MYO835.png
BKJEC6[QR]5B5U~{IU{W}HV.png


开启定时器中断

20210222132651258.png

3.生成工程

1.开启定时器中断

S~})YAYQI]`J9(D9S43~FBR.png

  1.         LCD_Init();
  2.         LCD_Clear(White);
  3.         LCD_SetTextColor(Red);
  4.         
  5.         HAL_TIM_OC_Start_IT(&htim3,TIM_CHANNEL_1);
  6.         HAL_TIM_OC_Start_IT(&htim3,TIM_CHANNEL_2);
  7.         TIM3->CCR1 = 10;
  8.         TIM3->CCR2 = 15;
  9.         TIM3->CNT = 0;
复制代码
  1.                 sprintf((char *)str, "num1 : %d", num1);
  2.                 LCD_DisplayStringLine(Line1, str);
  3.                 sprintf((char *)str, "num2 : %d", num2);
  4.                 LCD_DisplayStringLine(Line3, str);
  5.                
  6.                 sprintf((char *)str, "CNT : %d", TIM3->CNT);
  7.                 LCD_DisplayStringLine(Line7, str);
  8.                 sprintf((char *)str, "CCR1: %d", TIM3->CCR1);
  9.                 LCD_DisplayStringLine(Line8, str);
  10.                 sprintf((char *)str, "CCR2: %d", TIM3->CCR2);
  11.                 LCD_DisplayStringLine(Line9, str);
复制代码

以上都是初始化和测试显示函数,不需要多讲

2.更改HAL库TIM的中断总函数
由于输出比较的真的比较少,而且对于用HAL做的资料,本人就没找到。。。
所以查了原子提供的参考手册,然后也是被HAL库的集成度坑了。
首先对于中断标志位:

2[$MPR]G]EQ~~D2EM]EUY8H.png

TIMx_SR寄存器,第1.2位保存的通道1、2的捕获和比较中断标志,上面说的很清楚,当在输出比较模式下,计数值和比较值匹配时,该位会置1。

3、中断服务函数



  1. uint8_t state1 = 0, state2 = 0;

  2. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.         if((TIM3->DIER & (0x1 << 1)) && (TIM3->DIER & (0x1 << 2)))
  5.         {
  6.                 HAL_TIM_OC_Stop_IT(&htim3,TIM_CHANNEL_1);
  7.                 HAL_TIM_OC_Stop_IT(&htim3,TIM_CHANNEL_2);
  8.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//(TIM3->SR & (0x1 << 1))
  9.                 {
  10.                         sprintf((char *)arr, "CNT: %d, CCR1: %d\r\n", TIM3->CNT,TIM3->CCR1);
  11.                         HAL_UART_Transmit(&huart1, arr,sizeof(arr),50);
  12.                         if(state1)
  13.                         {
  14.                                 TIM3->CCR1 = TIM3->CCR1 + (uint8_t)(T1*(double)PA6_Duty/100);
  15.                                 state1 = 0;
  16.                         }
  17.                         else
  18.                         {
  19.                                 TIM3->CCR1 = TIM3->CCR1 + T1 - (uint8_t)(T1*(double)PA6_Duty/100);
  20.                                 state1 = 1;
  21.                         }
  22.                         TIM3->CCR1 = TIM3->CCR1 % TIM3_Period;
  23.                         num1++;

  24.                 }
  25.                
  26.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)//(TIM3->SR & (0x1 << 2))
  27.                 {
  28.                         sprintf((char *)arr, "CNT: %d,           CCR2: %d \r\n", TIM3->CNT,TIM3->CCR2);
  29.                         HAL_UART_Transmit(&huart1, arr,sizeof(arr),50);
  30.                         if(state2)
  31.                         {
  32.                                 TIM3->CCR2 = TIM3->CCR2 + (uint8_t)(T2*(double)PA7_Duty/100);
  33.                                 state2 = 0;
  34.                         }
  35.                         else
  36.                         {
  37.                                 TIM3->CCR2 = TIM3->CCR2 + T2 - (uint8_t)(T2*(double)PA7_Duty/100);
  38.                                 state2 = 1;
  39.                         }
  40.                         TIM3->CCR2 = TIM3->CCR2 % TIM3_Period;
  41.                         num2++;
  42.                 }
  43.         }
  44.         HAL_TIM_OC_Start_IT(&htim3,TIM_CHANNEL_1);
  45.         HAL_TIM_OC_Start_IT(&htim3,TIM_CHANNEL_2);
  46. }
复制代码

在测试输出波形时,发现会一直产生中断,导致主函数没办法运行,所以在中断开启时关闭PWM中断,中断结束后再重新开启(虽然会有时间延迟,有一点波形误差,但肉眼是分不清的。)。
代码测试:

2M)@V(]QUA$H%@7UL8P3M_P.png


收藏 评论0 发布时间:2022-7-7 16:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版