搜索
bottom↓
回复: 3

STM32 TIM1输出PWM 丢失数据

[复制链接]

出0入0汤圆

发表于 2014-10-14 13:14:43 | 显示全部楼层 |阅读模式
用TIM1输出400Hz的PWM,TIM_Period设置为1000 ,在主程序中每隔4ms,CCR2的值自加1。但是输出的PWM占空比并不是每隔4ms左右更新一次,而是隔0.5s更新一次。


  1. TIM_TimeBaseInitTypeDef                TIM_TimeBaseStructure;
  2.         TIM_OCInitTypeDef                                  TIM_OCInitStructure;
  3.         uint16_t PrescalerValue = 0;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  5.        
  6.         PrescalerValue = (uint16_t) (SystemCoreClock / 250000) - 1;                //Ô¤·ÖƵϵÊý    400 000
  7.         TIM_TimeBaseStructure.TIM_Period = 999;                                                                                                //¼ÆÊýÉÏÏß       
  8.         TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;                                        //pwmʱÖÓ·ÖƵ
  9.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;       
  10.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                //ÏòÉϼÆÊý
  11.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  12.        


  13.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  14.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  15.         TIM_OCInitStructure.TIM_Pulse = 249;                                                                                                  //³õʼռ¿Õ±È1ms
  16.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  17.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  18.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  19.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  20.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  21.        
  22.         TIM_ARRPreloadConfig(TIM1, ENABLE);
  23.         TIM_Cmd(TIM1, ENABLE);
  24.         TIM_CtrlPWMOutputs(TIM1,ENABLE);
复制代码


主程序
  1.                 while(1)
  2.                 {
  3.                         TIM1->CCR2++;
  4.                         if(TIM1->CCR2==999)
  5.                         {
  6.                                 TIM1->CCR2=0;
  7.                         }
  8.                         delay_ms(4);
  9.                 }
复制代码


这段程序用TIM4输出时是正常的。不知道大家是否遇到过这种情况,恳请会的朋友可以指点下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2014-10-15 10:51:12 | 显示全部楼层
看来没人回答啊! 原因已经找到了,我自己来解答吧!

出0入0汤圆

发表于 2014-10-15 11:03:10 | 显示全部楼层
怎么回事呢?

出0入0汤圆

 楼主| 发表于 2014-10-15 11:16:26 | 显示全部楼层


首先要说那个V10版的中文数据手册了,上面介绍了重复计数功能,但是没有提到RCR寄存器,中文数据更新太慢了。看来不能以翻译过的手册为主,要和英文版对照着看。
然后就是程序中的初始化代码,RCR寄存器的值虽然为0,但是初始化结构体初值是不确定的,看下图。

0XE7是231大概4ms*231=924ms产生一次更新事件(我又看了下我的大概是928更新一次)
程序中设置了TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
所以会在每次更新到来之后才会装在CCR3的值。
所以在初始语句中加入一句TIM_TimeBaseStructure.TIM_RepetitionCounter=0;问题解决了。

但是若将程序改为TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Disable);按道理应该也可以避免这种现象,但是无效果,不知道为什么。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-9 13:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表