OpenEdv-开源电子网

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

为什么我用定时器8的前4个通道输出4路pwm波,用逻辑分析仪测得4路pwm波的频率和占空比全是乱码

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-6-7
在线时间
7 小时
发表于 2017-7-28 22:03:54 | 显示全部楼层 |阅读模式

//这是初始化程序
void TIM8_PWM_Init(u16 Period)//高级定时器
{
        GPIO_InitTypeDef GPIO_InitStruct;//定义GPIO_Init初始化结构体
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定义TIM_TimeBaseInit的初始化结构体
        TIM_OCInitTypeDef TIM_OCInitStruct;//定义TIM_OC1234Init初始化的结构体变量
       

       
        //开启TIM8时钟,配置PC6 7 8 9为复用输出
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);       

        //使能GPIO外设时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
       
        //设置该引脚为复用输出功能,输出 TIM8 CH1234 的PWM脉冲波形
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStruct);
       
       
       
       
       
        //设置TIM8的ARR和PSC
        TIM_TimeBaseInitStruct.TIM_ClockDivision=0;//设置时钟分割(?)
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseInitStruct.TIM_Period=Period;
        TIM_TimeBaseInitStruct.TIM_Prescaler=71;
        TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStruct);//在tim.h里1055行
       
        //设置 TIM8_CH1234 的PWM模式及通道方向,使能TIM8的CH1输出
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM1模式
        TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;//输出极性为高
        TIM_OCInitStruct.TIM_Pulse=0;//CRRx的值
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能       
        TIM_OC1Init(TIM8,&TIM_OCInitStruct);
       
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM1模式
        TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;//输出极性为高
        TIM_OCInitStruct.TIM_Pulse=0;//CRRx的值
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能       
        TIM_OC2Init(TIM8,&TIM_OCInitStruct);
       
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM1模式
        TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;//输出极性为高
        TIM_OCInitStruct.TIM_Pulse=0;//CRRx的值
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能       
        TIM_OC3Init(TIM8,&TIM_OCInitStruct);
       
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM1模式
        TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;//输出极性为高
        TIM_OCInitStruct.TIM_Pulse=0;//CRRx的值
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能       
        TIM_OC4Init(TIM8,&TIM_OCInitStruct);

       
       
        //CH1234预装载使能
        TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Enable);
        TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);
        TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM8,TIM_OCPreload_Enable);
       
       
       
        //使能TIMx的预装载寄存器
        TIM_ARRPreloadConfig(TIM8,ENABLE);
       
        //使能TIM8
        TIM_Cmd(TIM8,ENABLE);//使能TIM8
       
        //高级定时器-接着弄-设置MOE输出,使能PWM输出
        TIM_CtrlPWMOutputs(TIM8,ENABLE);//tim.h的1068行
}

如果不是初始化错了,有可能是其他什么原因呢?

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

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-6-7
在线时间
7 小时
 楼主| 发表于 2017-7-29 11:02:17 | 显示全部楼层
解决了,解决了!之前我电脑的USB接口不够用,就把逻辑分析仪插到另外一台电脑的USB接口了。刚刚我插到我自己电脑的USB接口试了一下,没问题,完全正确。有可能是逻辑分析仪跨太长的距离,或者中间干扰太大的原因,我也不是很清楚
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-7-28 22:29:30 | 显示全部楼层
是乱的,证明初始化肯定是哪里错了.
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-6-7
在线时间
7 小时
 楼主| 发表于 2017-7-29 09:52:12 | 显示全部楼层
操作系统 发表于 2017-7-28 22:29
是乱的,证明初始化肯定是哪里错了.

我的代码就在上面,检查了好几遍呢!哪里错了呢?
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-7-29 10:54:49 | 显示全部楼层
南方的熊 发表于 2017-7-29 09:52
我的代码就在上面,检查了好几遍呢!哪里错了呢?

这种小问题自己搞定.
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-6-7
在线时间
7 小时
 楼主| 发表于 2017-7-29 11:05:25 | 显示全部楼层
操作系统 发表于 2017-7-29 10:54
这种小问题自己搞定.

解决了,是逻辑分析仪的问题 代码检查了无数遍
回复 支持 反对

使用道具 举报

1

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-7-29 12:11:49 | 显示全部楼层
KEIL自带的逻辑分析仪其实不能严格的说明程序一定正确,我之前也是用通用定时器输出PWM,在逻辑分析仪上面一点问题都没有,但是在示波器上波形就是混乱的,后来反复查找是自己对定时器做的的封装不对
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-19 16:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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