打印

各位大侠求助 关于TM4C123定时器同步的问题

[复制链接]
1854|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shiqiaocanxue|  楼主 | 2015-5-8 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟要做一个测量PWM方波周期的程序,用的测周法,用的是TM4C123芯片的两个定时器,一个用来捕获上升沿,可以记下两个上升沿各自的时间,另一个定时器用来跟前一个同样的周期循环运行,记下两个上升沿之间定时器溢出的次数。但在跑程序的过程中总会出现问题就是,由于两个定时器不同步(通过CCS观察两个定时器寄存器),会出现小概率的少计一次或多计一次溢出。  我用了TimerSynchronize()这个库函数也不行,我用ccs的调试观测到的寄存器数值是同步读出来的吗?如果是那就真的是我没有使它们同步了。还有大侠们知道怎么同步两个定时器吗?

相关帖子

沙发
shiqiaocanxue|  楼主 | 2015-5-8 16:34 | 只看该作者
两个定时器必须保证同样的相位和周期才能准确地计算两个上升沿之间的时间,相位不同步就会出现溢出次数记录少一或多一的情况。

使用特权

评论回复
板凳
shiqiaocanxue|  楼主 | 2015-5-8 16:40 | 只看该作者
void timer_capture_init(void)
{
                                  SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
                                    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);
                                    //使能定时器捕获上升沿所在GPIO
                                    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
                                    GPIOPinConfigure(GPIO_PB4_T1CCP0);
                                    GPIOPinTypeTimer(GPIO_PORTB_BASE,GPIO_PIN_4);

                                  //配置TIMER1为输入边沿计时模式
                                  TimerConfigure(TIMER1_BASE,TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_CAP_TIME);
                                  TimerControlEvent(TIMER1_BASE,TIMER_A,TIMER_EVENT_POS_EDGE);
                    //配置TIMER2为周期计数模式
                                  TimerConfigure(TIMER2_BASE,TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_PERIODIC);
                    //设置两个定时器的初值
                                  TimerLoadSet(TIMER1_BASE,TIMER_A,0xFFFF);
                                 
                                  TimerLoadSet(TIMER2_BASE,TIMER_A,0xFFFF);
                                 
                                  //配置定时器1和定时器2的中断,定时器1为捕获中断,定时器2为溢出中断
                                  TimerIntEnable(TIMER1_BASE,TIMER_CAPA_EVENT);
                                  TimerIntEnable(TIMER2_BASE,TIMER_TIMA_TIMEOUT);
                                  IntRegister(INT_TIMER1A,Timer1IntHandler);
                                  IntRegister(INT_TIMER2A,Timer2IntHandler);
                                  IntEnable(INT_TIMER1A);
                                  IntEnable(INT_TIMER2A);
                    IntMasterEnable();//启用处理器中断

                                  //设置中断优先级,周期定时器抢占优先级等于捕获定时器
                                  IntPrioritySet(INT_TIMER1A,0);
                                  IntPrioritySet(INT_TIMER2A,0);

                                  //两个定时器同时触发
                                  TimerEnable(TIMER1_BASE,TIMER_A);
                                  TimerEnable(TIMER2_BASE,TIMER_A);
                TimerSynchronize(TIMER0_BASE,TIMER_1A_SYNC|TIMER_2A_SYNC);

}

使用特权

评论回复
地板
shiqiaocanxue|  楼主 | 2015-5-8 16:41 | 只看该作者
把初始化的代码发上来给大家看看,哪位大侠帮帮我?

使用特权

评论回复
5
dirtwillfly| | 2015-5-8 17:42 | 只看该作者
为啥要用两个定时器?用一个定时器+一个变量就可以啊

使用特权

评论回复
6
shiqiaocanxue|  楼主 | 2015-5-9 08:48 | 只看该作者
dirtwillfly 发表于 2015-5-8 17:42
为啥要用两个定时器?用一个定时器+一个变量就可以啊

因为我怕进入中断处理函数之后,另外一种中断又发生。而用两个定时器可以有两个中断处理函数(抢占优先级一样)保证不会忽略任何一种中断。

使用特权

评论回复
7
深蓝漓落| | 2015-5-9 09:05 | 只看该作者
频率相位跟踪?

使用特权

评论回复
8
shiqiaocanxue|  楼主 | 2015-5-9 09:18 | 只看该作者

啥意思?

使用特权

评论回复
9
shiqiaocanxue|  楼主 | 2015-5-9 15:49 | 只看该作者
dirtwillfly 发表于 2015-5-8 17:42
为啥要用两个定时器?用一个定时器+一个变量就可以啊

而且TM4C123GH6PM的定时器在计时捕获模式下是不能产生溢出中断的,只能产生捕获中断。不然数据手册上给出的方法也不会是使用两个定时器了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

41

帖子

0

粉丝