打印
[STM8]

请教 STM8 PWM 输出启动的设置问题

[复制链接]
4902|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

16M内部时钟,不分频,PWM输出周期5us,PWM1 2 3 4 分别输出1 2 3 4 us。
为什么第一个输出波形不正常?
直接复制的例子TIM1_7PWM_Output里的代码,只改了周期和比较值。
沙发
guanggaoren| | 2011-9-28 17:43 | 只看该作者
帮顶.

使用特权

评论回复
板凳
香水城| | 2011-9-28 17:49 | 只看该作者
估计是因为初始化时没有设置比较寄存器的初值。

使用特权

评论回复
地板
delong_z|  楼主 | 2011-9-29 09:35 | 只看该作者
比较寄存器已经初始化,代码如下:

#define CCR1_Val  ((uint16_t)1*16)
#define CCR2_Val  ((uint16_t)2*16)
#define CCR3_Val  ((uint16_t)3*16)
#define CCR4_Val  ((uint16_t)4*16)
static void TIM1_Config(void);

void main(void)
{
  CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);  
  TIM1_Config();
  while (1)
  {
  }
}
static void TIM1_Config(void)
{
  TIM1_DeInit();
  TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 5*16, 0);
  TIM1_OC1Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE,
               CCR1_Val, TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
               TIM1_OCNIDLESTATE_RESET);
  TIM1_OC2Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, CCR2_Val,
               TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
               TIM1_OCNIDLESTATE_RESET);
  TIM1_OC3Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE,
               CCR3_Val, TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
               TIM1_OCNIDLESTATE_RESET);
  TIM1_OC4Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, CCR4_Val, TIM1_OCPOLARITY_LOW,
               TIM1_OCIDLESTATE_SET);
  TIM1_Cmd(ENABLE);
  TIM1_CtrlPWMOutputs(ENABLE);
}

使用特权

评论回复
5
香水城| | 2011-9-29 13:32 | 只看该作者
你找找看,有一个Preload功能。

STM8_TIM1_Preload.gif (36.81 KB )

STM8_TIM1_Preload.gif

使用特权

评论回复
6
delong_z|  楼主 | 2011-9-29 16:17 | 只看该作者

谢谢版主,可以了。
1、必须打开预加载。
2、启动定时器后手动生成一次更新。
static void TIM1_Config(void)
{
  TIM1_DeInit();
  
  TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 5*16, 0);
  
  TIM1_ARRPreloadConfig(ENABLE);  //必须使用预加载。
  TIM1_OC1PreloadConfig(ENABLE);  //必须使用预加载。
  TIM1_OC2PreloadConfig(ENABLE);
  TIM1_OC3PreloadConfig(ENABLE);
  TIM1_OC4PreloadConfig(ENABLE);
  
  TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE, CCR1_Val, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_LOW, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET);
  TIM1_OC2Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE, CCR2_Val, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_LOW, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET);
  TIM1_OC3Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE, CCR3_Val, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_LOW, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET);
  TIM1_OC4Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, CCR4_Val, TIM1_OCPOLARITY_HIGH, TIM1_OCNIDLESTATE_RESET);
  
  TIM1_CtrlPWMOutputs(ENABLE);    //允许输出。
  TIM1_Cmd(ENABLE);               //开始计数。
  
  TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE);  //手动生成一次更新事件。
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

84

帖子

1

粉丝