高手给看看,TIM1 PWM输出不了

2019-07-20 22:23发布

本帖最后由 phpython 于 2017-8-18 16:14 编辑

芯片为 STM32F103RCT6

pwm.c
[mw_shl_code=c,true]//CH1 PWM输出初始化设置
void Tim1PwmInit(u16 arr,u16 psc){
    //声明定时器1 PWM 输出结构体变量
    TIM_OCInitTypeDef TIM1_OCInitStruct;
   
    //声明定时器1结构体变量
    TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct;
   
    //声明GPIO结构体变量
    GPIO_InitTypeDef GPIOA_InitStruct;
   
    //使能定时器1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
   
    //使能IO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
   
    //初始化IO配置
    GPIOA_InitStruct.GPIO_Pin = GPIO_Pin_8;
    GPIOA_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIOA_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;   
    GPIO_Init(GPIOA,&GPIOA_InitStruct);
   
    //定时器配置   
    TIM1_TimeBaseInitStruct.TIM_Period = psc;//设置用来作为 TIMx 时钟频率除数的预分频值 不分频
    TIM1_TimeBaseInitStruct.TIM_Prescaler = arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值  80K
    TIM1_TimeBaseInitStruct.TIM_ClockDivision = 0;//时钟分割:TDTS = Tck_tim
    TIM1_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStruct);
   
    //设置定时器外设PWM输出配置
    TIM1_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2; //脉宽调制模式 2
    TIM1_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM1_OCInitStruct.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
    TIM1_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
    TIM_OC1Init(TIM1,&TIM1_OCInitStruct);
   
    //定时器输出PWM使能
    TIM_CtrlPWMOutputs(TIM1,ENABLE);
   
    //CH1 预装载使能
    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
   
    //使能 TIMx 在 ARR 上的预装载寄存器
    TIM_ARRPreloadConfig(TIM1,ENABLE);
   
    //使能定时器
    TIM_Cmd(TIM1,ENABLE);
}
[/mw_shl_code]

main.c
[mw_shl_code=c,true]int main(){
    u16 led0pwmval=0;
    u8 dir=1;
    delay_init();  //延时函数初始化
//    LedInit();  //初始化与 LED 连接的硬件接口
    Tim1PwmInit(899,0);//不分频。PWM 频率=72000/(899+1)=80Khz
   
    while(1){
        delay_ms(10);
        if(dir)led0pwmval++;
        else led0pwmval--;
        if(led0pwmval>300)dir=0;
        if(led0pwmval==0)dir=1;
        TIM_SetCompare1(TIM1,led0pwmval);
    }
}
//int main(){
//    delay_init();  //延时函数初始化
//    LedInit();  //初始化与 LED 连接的硬件接口
//   
//    while(1){
//        GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_2);
//        delay_ms(500);
//        GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_2);
//        delay_ms(500);
//    }
//}
[/mw_shl_code]

在线急等,谢谢高手

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-21 01:40
 精彩回答 2  元偷偷看……
17602515236
2楼-- · 2019-07-21 06:21
把输出极性改成TIM_OCPolarity_Low或者PWM模式改成PWM1
liuliupiaoxue
3楼-- · 2019-07-21 11:56
//    LedInit();  //初始化与 LED 连接的硬件接口
这行被你屏蔽掉了,肯定看不到灯的亮度变化了,应该是这个问题
bruceSTM32
4楼-- · 2019-07-21 12:45
本帖最后由 bruceSTM32 于 2017-11-29 23:50 编辑

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
如果按这样的顺序定义变量,其他的都是例程,仿真都没有问题,下载到开发板上就出现DS0就常亮,把这变量定义顺序换一下就正常,为什么会出现这个现象,我也不知道具体的原因,期待有人能够解答。
peng1554
5楼-- · 2019-07-21 14:50
附上103RCT6正常PWM输出的代码
李花生
6楼-- · 2019-07-21 18:09
 精彩回答 2  元偷偷看……

一周热门 更多>