你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
sappppp 提问时间:2016-1-15 09:42 /
想要請問各位先進,我利用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;

  }
}

收藏 评论4 发布时间:2016-1-15 09:42

举报

4个回答
回答时间: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的章节了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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时反而什么也看不到了。

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





评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版