OpenEdv-开源电子网

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

由于定时器资源不够,想使用其中一个定时器分时复用去输出8路PWM控制舵机,但是出现了意想不到的波形。。

[复制链接]

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
发表于 2014-12-29 18:32:33 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]u8 IRQ_flag; volatile u16 PWM_Val[11]={1500,1500,1500,1500,1500,1500,1500,1500,1500,1500,1500}; void TIM4_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM4, TIM_IT_Update ,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级2级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM4, ENABLE); //使能TIMx外设 } //分时复用,8路PWM输出,周期为20ms void TIM4_IRQHandler(void) //TIM4中断 { static u8 IRQ_CNT=1; if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源 LED0=!LED0; switch(IRQ_CNT) { case 1: { PWM1=1; TIM4_Int_Init(PWM_Val[3],71); //PWM1高电平时间 }break; case 2: { PWM1=0; TIM4_Int_Init(2500-PWM_Val[3],71); }break; case 3: { PWM2=1; TIM4_Int_Init(PWM_Val[4],71); //PWM2高电平时间 }break; case 4: { PWM2=0; TIM4_Int_Init(2500-PWM_Val[4],71); }break; case 5: { PWM3=1; TIM4_Int_Init(PWM_Val[5],71); //PWM3高电平时间 }break; case 6: { PWM3=0; TIM4_Int_Init(2500-PWM_Val[5],71); }break; case 7: { PWM4=1; TIM4_Int_Init(PWM_Val[6],71); //PWM4高电平时间 }break; case 8: { PWM4=0; TIM4_Int_Init(2500-PWM_Val[6],71); }break; case 9: { PWM5=1; TIM4_Int_Init(PWM_Val[7],71); //PWM5高电平时间 }break; case 10: { PWM5=0; TIM4_Int_Init(2500-PWM_Val[7],71); }break; case 11: { PWM6=1; TIM4_Int_Init(PWM_Val[8],71); //PWM6高电平时间 }break; case 12: { PWM6=0; TIM4_Int_Init(2500-PWM_Val[8],71); }break; case 13: { PWM7=1; TIM4_Int_Init(PWM_Val[9],71); //PWM7高电平时间 }break; case 14: { PWM7=0; TIM4_Int_Init(2500-PWM_Val[9],71); }break; case 15: { PWM8=1; TIM4_Int_Init(PWM_Val[10],71); //PWM8高电平时间 }break; case 16: { PWM8=0; TIM4_Int_Init(2500-PWM_Val[10],71); IRQ_CNT=0; }break; } IRQ_CNT++; } }[/mw_shl_code]

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

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-12-29 18:34:34 | 显示全部楼层
最后的波形竟然是8路周期为120us的PWM,高电平时间为7.5us。。而且更改TIM4_Int_Init(PWM_Val[3],71);里面的两个参数波形竟然不变,但是把TIM4_Int_Init(PWM_Val[3],71)语句去掉,波形就产生变化了。请问这是什么原因呢?
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-12-29 18:35:54 | 显示全部楼层
回复【2楼】whut-showming:
---------------------------------
难道是定时器自己的中断服务程序里面不能调用自己的初始化函数吗?还请大神们帮帮忙。。
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-12-29 21:39:56 | 显示全部楼层
因为我用的是STM32F103RBT6,只有1个高级定时器,3个通用定时器,但是我需要输出11路PWM控制舵机,并且还需要一个定时器作为计时,一个定时器做串口,所以只剩下两个定时器来输出PWM,最多只有8路PWM输出(TIM1的互补PWM不算),所以我是用1个高级定时器TIM1输出3路PWM,一个通用定时器TIM4分时复用输出8路PWM。但是我刚刚弄了一下午,发现了一个问题,就是当四个定时器同时使用时,我的TIM1那三个通道就输出不了PWM了,TIM3也不能计时了,只有把TIM4中的switch语句去掉,就是不让TIM4分时复用8路PWM后,TIM1,TIM2就工作正常了。请问这是不是硬件bug呢?
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-12-29 21:47:24 | 显示全部楼层
还是真的在定时器的中断服务程序中不能初始化自己?请大虾们帮帮忙啊。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-29 23:27:08 | 显示全部楼层
建议你仿真一下,看看寄存器的变化,是否符合预期。另外,在中断里面又初始化定时器,总感觉不太妙。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-12-30 00:10:16 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
用仿真器看各个寄存器的值都是没有问题的,唯一有问题的就是TIM_CNT计时有问题,case语句执行间隔时间不对,而且用小灯看定时器的中断,发现竟然是每7.5us进一次中断。。。真的是感觉不太妙。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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