OpenEdv-开源电子网

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

STM32的PWM输出第一个周期不准的问题,请原子哥指点下呀

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-11-22
在线时间
4 小时
发表于 2012-11-29 10:47:02 | 显示全部楼层 |阅读模式

我写了个程序,用TIM3实现四路PWM输出,仿真结果发现第一个周期输出波形不对,其它的都好的,查了两天没找出毛病,特来向各位求教啊
波形图:



我的程序:
#include "stm32f10x.h"

void gpio_pwminit(void)
{
   GPIO_InitTypeDef GPIO_InitStructure; 
  
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7; //PA6-CH1  PA7-CH2
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      // 复用推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1; //PB0-CH3  PB1-CH4
   GPIO_Init(GPIOB, &GPIO_InitStructure); 
}

void timer3_init(u16 DIV_value,u16 period)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   TIM_OCInitTypeDef  TIM_OCInitStructure;    

   u16 CCR1VAL = 100;
   u16 CCR2VAL = 400;
   u16 CCR3VAL = 600;
   u16 CCR4VAL = 800;

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 

   TIM_ARRPreloadConfig(TIM3, ENABLE);    // 使能TIM3预装载寄存器的buffer
   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR1预装载
   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR2预装载
   TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR3预装载
   TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR4预装载


   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         //配置为PWM模式1
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //当定时器计数值小于CCR1_Val时为高电平
  // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //当定时器计数值小于CCR1_Val时为低电平
  
  
   TIM_OCInitStructure.TIM_Pulse = CCR1VAL;   //设置跳变值,当计数器计数到这个值时,电平发生跳变
   TIM_OC1Init(TIM3, &TIM_OCInitStructure);   //使能通道1    
   TIM_OCInitStructure.TIM_Pulse = CCR2VAL;   //设置通道2的电平跳变值,输出另外一个占空比的PWM
   TIM_OC2Init(TIM3, &TIM_OCInitStructure);   //使能通道2
   TIM_OCInitStructure.TIM_Pulse = CCR3VAL;   //设置通道3的电平跳变值,输出另外一个占空比的PWM
   TIM_OC3Init(TIM3, &TIM_OCInitStructure);   //使能通道3
   TIM_OCInitStructure.TIM_Pulse = CCR4VAL;   //设置通道4的电平跳变值,输出另外一个占空比的PWM
   TIM_OC4Init(TIM3, &TIM_OCInitStructure);   //使能通道4   
   
   TIM_TimeBaseStructure.TIM_Period = period;                   //定时器计数周期
   TIM_TimeBaseStructure.TIM_Prescaler = DIV_value;             //定时器时钟分频
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;                 //
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);    //初始化时基单元 
   
   TIM_Cmd(TIM3, ENABLE);                     //使能定时器3
}

int main(void)
{
   gpio_pwminit(); 
  timer3_init(7199,999);

    
   while(1)
  {
  }
}


 

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-29 13:25:17 | 显示全部楼层
可能和CNT的初值有关。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-11-22
在线时间
4 小时
 楼主| 发表于 2012-11-29 17:20:18 | 显示全部楼层
我试过在初始化的时候TIM3->CNT = 0,仍然不行的
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-11-22
在线时间
4 小时
 楼主| 发表于 2012-11-30 12:58:07 | 显示全部楼层
试过各种方法,软件产生更新事件,置位CCIF等等,还是没解决,哪位大神救救我啊
回复 支持 反对

使用道具 举报

18

主题

82

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2011-10-27
在线时间
0 小时
发表于 2012-11-30 14:25:55 | 显示全部楼层
不信会出现这种事情,你在示波器上观察试试?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 01:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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