OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7660|回复: 8

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

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-8-18
在线时间
3 小时
发表于 2017-8-18 16:08:43 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 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]

在线急等,谢谢高手

最佳答案

查看完整内容[请看2#楼]

你的arr和psc赋值错了。搞反了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-18 16:08:44 | 显示全部楼层
你的arr和psc赋值错了。搞反了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-19 09:40:28 | 显示全部楼层
把输出极性改成TIM_OCPolarity_Low或者PWM模式改成PWM1
回复

使用道具 举报

2

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2017-5-19
在线时间
146 小时
发表于 2017-8-21 09:22:42 | 显示全部楼层
//    LedInit();  //初始化与 LED 连接的硬件接口
这行被你屏蔽掉了,肯定看不到灯的亮度变化了,应该是这个问题
回复

使用道具 举报

6

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2015-7-15
在线时间
36 小时
发表于 2017-11-29 23:35:05 | 显示全部楼层
本帖最后由 bruceSTM32 于 2017-11-29 23:50 编辑

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
如果按这样的顺序定义变量,其他的都是例程,仿真都没有问题,下载到开发板上就出现DS0就常亮,把这变量定义顺序换一下就正常,为什么会出现这个现象,我也不知道具体的原因,期待有人能够解答。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-6-13 19:02:46 | 显示全部楼层
附上103RCT6正常PWM输出的代码

MINI 4路PWM输出(PA8,9,10,11)-1.5KHZ.rar

2.16 MB, 下载次数: 618

回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2017-9-6
在线时间
56 小时
发表于 2018-8-15 14:17:37 | 显示全部楼层
peng1554 发表于 2018-6-13 19:02
附上103RCT6正常PWM输出的代码

感谢你的代码
回复

使用道具 举报

0

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2017-8-8
在线时间
67 小时
发表于 2018-8-15 16:39:43 | 显示全部楼层
还是原子哥厉害。一眼就看出问题来了!你输出波的周期为:0*1/(72MHZ/900)=0秒哇,本来应该是:900*1/72MHZ哇!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-7-16
在线时间
1 小时
发表于 2019-7-16 20:09:23 | 显示全部楼层
peng1554 发表于 2018-6-13 19:02
附上103RCT6正常PWM输出的代码

感谢大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 05:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表