OpenEdv-开源电子网

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

TIM1高级定时器互不输出,遇到一个很奇怪的问题,求助

[复制链接]

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2019-1-8 14:22:59 | 显示全部楼层 |阅读模式
20金钱
写的无刷电机程序,如题,今天突然发现了一个问题。我初始化TIM1后,如果6路互补一块输出,没有问题,波形很正确,如果我改成两路两路的输出,就会出现一个问题。下图中,主函数中有个test函数,加了这个test函数就输出正常,不加,输出就不正常,关键这个test里只有一个初始化的一个函数,并且随便初始化哪个IO口都可以使得波形输出正常,然后不加这个函数就输出不正常了,并且这个函数必须放在这个位置,把这个函数拆开都不行,感觉很奇怪,请大神们指点一下,哪里出问题了。

定时器1的初始化函数,基本没问题的

定时器1的初始化函数,基本没问题的

初始化,应该没什么大问题。

main函数,整体就是定时器1初始化,然后开始输出两路PWM

main函数,整体就是定时器1初始化,然后开始输出两路PWM

这里就是这个test很奇怪,没有这个test输出就不正常,有test就正常。

这个test函数中就只有这个,没有这个输出就不正常

这个test函数中就只有这个,没有这个输出就不正常

这就是test里做的事,我又在TIM1初始化的时候,专门加了这两句,也不行,然后又加了definit也不行

输出两路PWM后,延时一段时间,在换另两路PWM输出

输出两路PWM后,延时一段时间,在换另两路PWM输出

输出两路,然后延时,然后换相

换相顺序

换相顺序

换相顺序程序

不正常波形整体体现

不正常波形整体体现

这就是有问题的波形,红线框起来的地方,本来应该没有延时的,但是现在延时竟然有1ms左右,而且上面的那个红框中,不应该出现波形,而是高电平的,如下图所示。

局部有问题

局部有问题

最佳答案

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

找到原因了,看了一下寄存器说明,如下所示, 先将这里提到的OC3PE失能,即与装载失能,然后将比较值写进去,再去失能与装载,那么就会立即生效了。 只是不知道为什么,main中的test怎么会让输出使能的呢?不懂其中的原有,不知道谁能帮我解答下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2019-1-8 14:23:00 | 显示全部楼层
找到原因了,看了一下寄存器说明,如下所示,

CCR3寄存器说明

CCR3寄存器说明


先将这里提到的OC3PE失能,即与装载失能,然后将比较值写进去,再去失能与装载,那么就会立即生效了。

只是不知道为什么,main中的test怎么会让输出使能的呢?不懂其中的原有,不知道谁能帮我解答下。
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2019-1-8 14:24:26 | 显示全部楼层
上传一份我的代码,请大神帮忙看一下

1.8.rar

2.99 MB, 下载次数: 17

回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-12-17
在线时间
15 小时
发表于 2019-1-8 14:57:19 | 显示全部楼层
test函数里的结构体声明错了,刚好底下函数也跟着错,所以就算你放在定时器初始化里也没用
void Test(void)
{
        GPIO_InitTypeDef GPIO_InitStructrue;
        GPIO_Init(GPIOA,&GPIO_InitStructrue);
}
void CaptrueInputInit(void)
{
        GPIO_InitTypeDef GPIO_InitStructrue;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
       
        GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB,&GPIO_InitStructrue);
       
        GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB,&GPIO_InitStructrue);
       
        GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB,&GPIO_InitStructrue);
}
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2019-1-8 15:04:05 | 显示全部楼层
杰克萝卜森 发表于 2019-1-8 14:57
test函数里的结构体声明错了,刚好底下函数也跟着错,所以就算你放在定时器初始化里也没用
void Test(void ...

这个声明是局部变量,和别的函数里的声明没关系呀,和别的函数不一样也无所谓呀?您说的我是不是理解错了?
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-12-17
在线时间
15 小时
发表于 2019-1-8 15:12:05 | 显示全部楼层
结构体拼错了,正确的应该是 GPIO_InitStructure
如果void CaptrueInputInit(void)函数是另一组PWM,这组跟着test的,这里面的结构体拼错的GPIO_InitStructrue
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2019-1-8 15:21:27 | 显示全部楼层
杰克萝卜森 发表于 2019-1-8 15:12
结构体拼错了,正确的应该是 GPIO_InitStructure
如果void CaptrueInputInit(void)函数是另一组PWM,这组 ...

局部变量有什么关系呢,即使拼错了也不影响别的函数的使用呀。
再就是,我程序中虽然写了这个CaptrueInputInit函数,但是我没有掉用这个函数,这个函数是读IO状态用的,我程序编译没有语法错误的地方。至于您说的,我的理解就是您对局部变量这个理解有点问题,要么就是我还没理解您说的意思
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2019-1-8 17:07:15 | 显示全部楼层
我要顶一下我自己,哪位大哥帮我看一下呀,实在是找不到了才来求助了
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2019-1-8 17:25:40 | 显示全部楼层
wangmingwei093 发表于 2019-1-8 17:23
找到原因了,看了一下寄存器说明,如下所示,

先将这里提到的OC3PE失能,即与装载失能,然后将比较值写 ...

这里提到的更新事件指的是什么呢?计数值到重装在寄存器值的时候?还是什么?跟前面的test中的初始化有什么关系呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 01:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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