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

請問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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版