sappppp 发表于 2016-1-15 09:42:51

請問stm32f103做pwm輸出為什麼示波器一直沒有訊號?

想要請問各位先進,我利用stm32f103要做PWM輸出,利用timer1 對 GPIO PE8, PE9 做輸出
程式碼如下,當我將PE8,9設定為out_pp時利用示波器可以看到波形輸出,但是一設定成AF_PP時,示波器就看不到任何輸出了!
所以想要請問,我下面的程式碼哪裡出錯了呢?
謝謝
void Time_init(void)
{
    TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,DISABLE);
    TIM1_TimeBaseInitStruct.TIM_Prescaler = 999;
    TIM1_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM1_TimeBaseInitStruct.TIM_Period = 8;
    TIM1_TimeBaseInitStruct.TIM_ClockDivision = 0x0;
    TIM1_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStruct);
    TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
    TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE);   
    TIM_Cmd(TIM1,ENABLE);
}

void pwm_init(void)
{
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_Pulse = 120;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);


    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 680;
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);

    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
   
    TIM_ARRPreloadConfig(TIM1, ENABLE);
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 );

    TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE);
    TIM_Cmd(TIM1, ENABLE);
}


void GPIO_Configuration(void)
{
      GPIO_InitTypeDef g;                              
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);   

      g.GPIO_Pin =GPIO_Pin_9 ;                     
      g.GPIO_Mode = GPIO_Mode_AF_PP;   
      g.GPIO_Speed = GPIO_Speed_50MHz;   
      GPIO_Init(GPIOE, &g);   

      g.GPIO_Pin =GPIO_Pin_8 | GPIO_Pin_9 ;                     
      g.GPIO_Mode = GPIO_Mode_AF_PP;   
      g.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOE, &g);   
      GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
}


int main(void)
{
          RCC_Configuration();   
      NVIC_Configuration();
      GPIO_Configuration();
      Time_init();
      pwm_init();
      while(1);
}

void TIM1_CC_IRQHandler(void)   
{

if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
{
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

    GPIOE-> ODR ^= GPIO_Pin_9;

}
}

发表于 2016-1-15 10:40:07

GPIO_Mode_AF_PP时,是通过硬件控制PWM输出,而不是通过反转输出。楼主是如果想自己控制IO输出,需要设置为OUT模式。

sappppp 发表于 2016-1-15 13:56:24

那我想要再釐清一下,所以如果我想要直接利用示波器看PE8, PE9 AF_PP的波形變化是不能的嗎?
是必須要利用另一個pin腳例如PA10,將其設定為OUT_PP,才可以從示波器看到波形變化嗎?
我不知道我這樣理解是否正確呢?
那如果是這樣,我怎麼知道我PWM打出來的波形是否正確呢?
謝謝

adlu 发表于 2016-1-16 17:48:08

看来LZ没有理解PWM产生的机理。
我们通常说的PWM输出一般指的是MCU硬件PWM输出,用户只需要配置好参数,启动PWM输出之后,不需要执行任何GPIO的操作语句。比如,配置并启动后,就执行while(1);,什么都不做,也能在相应的引脚输出PWM。

这种PWM输出是有条件的。首先,具有PWM输出功能的引脚是固定的某几个引脚,这些引脚连接到定时器。具体是那些引脚具有PWM功能,要查看所用器件的datasheet。用户通过配置定时器的相关寄存器来得到PWM输出。

要想知道输出波形是否正确,就要用示波器观察器波形,看看周期和占空比是否和理论计算的一致。
至于怎么计算,就要自己看数据手册的TIMER的章节了。

xmshao 发表于 2016-1-16 18:30:03

本帖最后由 xmshao 于 2016-1-17 10:09 编辑

楼主问题应该出在对PWM输出的理解和REMAP配置应用。

PE9 PE8是对应CH1N\CH1互补输出。不过,你这里没有使能互补输出。那你的输出是在PE9.
要想让PE9输出PWM,使能AF_PP是应该的。out_pp是GPIO非复用输出配置。

然而你做的REMAP是部分REMAP,既然这样,OC1的输出还在PA8脚,而不是PE9脚。非常遗憾的上面代码里似乎连PA的时钟都没开。

但你关于TIMER1的基本配置还是可以用的,从描述来看捕捉中断也发生了。 碰巧的是你在中断里对PE9做了翻转操作,在PE9配置为OUT_PP时能看到IO切换信号,歪打正着的误以为是PWM信号。但如果你把PE9配置为AF_PP时反而什么也看不到了。

呵呵 大致过程和原因就这样。好好理下。上面伙伴也分别给你做了解释。





页: [1]
查看完整版本: 請問stm32f103做pwm輸出為什麼示波器一直沒有訊號?