OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5231|回复: 4

同一定时器产生不同频率PWM脉冲的问题

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-11-15
在线时间
0 小时
发表于 2013-11-15 20:24:19 | 显示全部楼层 |阅读模式

依照KEIL安装文件例程编写的程序,想用同一定时器产生四路不同频率脉冲,程序如下
部分程序如下:现在的问题是频率较低时很正常 但是频率很高时示波器显示就不正常了……请大家帮忙看看哪里有问题,奇怪的是仿真很好 下载到stm32上用示波器观察就不行了
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

//  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
/* Time base configuration */
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_TimeBaseStructure.TIM_Period = 65535;         //这里必须是65535
  TIM_TimeBaseStructure.TIM_Prescaler = 2;            //3分频
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;      //
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);          //初始化TIM3

  /* Output Compare Toggle Mode configuration: Channel1 */ 
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;    //输出比较翻转模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //使能通道1
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;                       //待装入输出比较寄存器中的脉冲值      

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         //输出为正逻辑
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);        //写入配置

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);          //使能或者失能TIMx在CCR1上的预装载寄存器

  /* Output Compare Toggle Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* Output Compare Toggle Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OC3Init(TIM3, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* Output Compare Toggle Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

  TIM_OC4Init(TIM3, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);      //开启计数器

  /* TIM IT enable */                //TIM1中断源设置,开启相应通道的捕捉比较中断
  TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);

}
void TIM3_IRQHandler(void)
{
  /* TIM3_CH1 toggling with frequency = 183.1 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)               //检查指定的TIM中断发生与否
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );              //清除TIMx的中断待处理位

    capture = TIM_GetCapture1(TIM3);    //获得输入捕获值,即计数器中的计数值

    TIM_SetCompare1(TIM3, capture + CCR1_Val );

                                                                                       //件也是相同的脉冲数
  }

  /* TIM3_CH2 toggling with frequency = 366.2 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM3);
    TIM_SetCompare2(TIM3, capture + CCR2_Val);

  }

  /* TIM3_CH3 toggling with frequency = 732.4 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
    capture = TIM_GetCapture3(TIM3);
    TIM_SetCompare3(TIM3, capture + CCR3_Val);
  }

  /* TIM3_CH4 toggling with frequency = 1464.8 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
    capture = TIM_GetCapture4(TIM3);
    TIM_SetCompare4(TIM3, capture + CCR4_Val);
  }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-15 20:33:02 | 显示全部楼层
这种模式,本来就不适合频率高的情况使用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-11-15
在线时间
0 小时
 楼主| 发表于 2013-11-15 20:34:03 | 显示全部楼层
刚看到一个帖子 说这种模式有弊端 不能频率太高 这正是我的问题 
请问有什么解决的办法吗
有什么其他办法能使一个定时器产生几路不同频率的高频PWM脉冲吗
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-11-15
在线时间
0 小时
 楼主| 发表于 2013-11-15 20:35:05 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
呵呵 原子哥回复好迅速
请问那有什么办法能使一个定时器产生几路不同频率的高频PWM脉冲吗
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-8-20
在线时间
6 小时
发表于 2013-11-15 21:19:04 | 显示全部楼层
用dsp把
  stm32似乎不适合输出pwm
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 03:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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