OpenEdv-开源电子网

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

TIM8四通道无法输出PWM,问题已解决

[复制链接]

4

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
588
金钱
588
注册时间
2018-8-17
在线时间
81 小时
发表于 2019-8-13 18:02:03 | 显示全部楼层 |阅读模式
TIM8无法输出PWM,软硬件因素很多,这里可以借鉴我的代码查看自己的原因,此程序已经验证成功

//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM8_PWM_Init(u16 arr,u16 psc)
{  
         GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能      

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM8_CH1-4
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1预装载使能       
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH2预装载使能       
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC3Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH3预装载使能       
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC4Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH4预装载使能       
       
        TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器

        TIM_Cmd(TIM8, ENABLE);  //使能TIM1
        TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能       

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
588
金钱
588
注册时间
2018-8-17
在线时间
81 小时
 楼主| 发表于 2019-8-13 18:03:46 | 显示全部楼层
最容易遗漏的两个部分是TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;
TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能       
回复 支持 反对

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14433
金钱
14433
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-8-13 19:34:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-19 11:28:39 | 显示全部楼层
单个通道都没问题 放一起就是没法用
世界和平
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-19 12:57:07 | 显示全部楼层
按照这个写法 在战舰板上用LED灯测试 只有通道四可用
再定义一个参数结构体TIM_OCInitTypeDef TIM_OC1InitStructure;专门用于通道一的初始化
四个通道都输出PWM波但是并未输出按照配置来讲应该同样的波形,就LED灯而言,通道一和四相同,通道二和三相同
世界和平
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-19 13:17:14 | 显示全部楼层
进一步测试双通道的情况:
1 2 不工作
1 3 不工作
1 4 1不工作4工作
2 3 正常
2 4 输出极性相反
3 4 正常
战舰V2板子上的结果,仅供参考
世界和平
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-19 13:21:41 | 显示全部楼层
礼拜天真好 发表于 2019-8-19 13:17
进一步测试双通道的情况:
1 2 不工作
1 3 不工作

2 4和3 4的结果写反了
世界和平
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-19 13:48:00 | 显示全部楼层
只想有通道一和通道二输出的写法最终如下,很奇葩

1.png

2.png



世界和平
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-20 15:09:14 | 显示全部楼层
TIM8通道一和二初始化的问题.png 忘说了,编译优化等级调至None,可以直接双通道输出。否则时而正常时而不正常。
但是目前还是有一个奇怪的问题,如上图所示,结构体TIM_OC1InitStructure根本就没有用到,但是如果删掉这一部分,OC1 OC2无法正常输出。
世界和平
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-21 08:36:07 | 显示全部楼层
应该是那块老板子的问题,在别的板子上跑正常
世界和平
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-21 11:31:31 | 显示全部楼层
是我那块老板子的问题,换在别的板子上跑就没奇奇怪怪的问题
世界和平
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6567
金钱
6567
注册时间
2018-6-27
在线时间
552 小时
发表于 2019-9-17 22:16:38 | 显示全部楼层
学习学习,学习学习。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 01:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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