用的是周公的模板,我用两个定时器分别进行上升沿和下降沿捕获,然后把前后两次的时间相减,得出高电平的时间,但是通过设置的flags和flags0发现进入两个定时器中断的次数不一样,问题出在哪里啊?
- /*********************************************************************************************************
- * Function Name: timer0Isr
- * Description: TIMER0 下降沿捕获中断处理函数
- * Input: 无
- * Output: 无
- * Return: 无
- *********************************************************************************************************/
- void timer0Isr(void)
- {
- TMR32B0IR=0x1f; //清除中断标志位
- flagDOWN=TMR32B0CR0;
- flags0=flags0+1;
- return;
- }
- /*********************************************************************************************************
- * Function Name: timer1Isr
- * Description: TIMER1 上升沿捕获中断处理函数
- * Input: 无
- * Output: 无
- * Return: 无
- *********************************************************************************************************/
- void timer1Isr (void)
- {
- TMR32B1IR=0x1f; //清除中断标志位
- flagUP=TMR32B1CR0;
- flags=flags+1;
- if((flags==1)&&(flagDOWN==0))
- {
- flagLOW=flagLOW+flagUP;
- }
- else
- {
- flagLOW=flagLOW+(flagUP-flagDOWN);
- }
- return;
- }
- /*********************************************************************************************************
- ** Function name: timer0Init
- ** Descriptions: 32位定时器0初始化函数
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void timer0Init (void)
- {
- SYSAHBCLKCTRL |= (1ul << 9); // 打开定时器模块
- TMR32B0PR =480-1; // 设置分频系数
- IOCON_PIO1_5 &= ~0x07; //初始化捕获引脚
- IOCON_PIO1_5 |=0x02;
- TMR32B0CCR = 0x05; // 设置CAP0.0上升沿捕获
- TMR32B0TC = 0;
- zyIsrSet(NVIC_TIMER32B0, (unsigned long)timer0Isr, PRIO_ONE); // 设置外部中断并使能
- TMR32B0TCR=0x01; //启动定时器
- }
- /*********************************************************************************************************
- ** Function name: timer1Init
- ** Descriptions: 32位定时器1初始化函数
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void timer1Init (void)
- {
- SYSAHBCLKCTRL |= (1ul << 10); // 打开32定时器1模块
- TMR32B1PR =480-1; // 设置分频系数
- IOCON_PIO1_0 &= ~0x07; //初始化捕获引脚
- IOCON_PIO1_0 |=0x03;
- TMR32B1CCR = 0x06; // 设置CAP1下降沿捕获
- TMR32B1TC = 0;
- zyIsrSet(NVIC_TIMER32B1, (unsigned long)timer1Isr, PRIO_TWO); // 设置外部中断并使能
- TMR32B1TCR=0x01; //启动定时器
- }
复制代码
此帖出自
小平头技术问答
又是版主大大啊,谢谢啊……
那如果两个定时器的话,是不是就由于两个定时器采集信号的端口不一样造成误差?
可能会有这样的误差,由于两个定时器的启动时间上不一致,某一时刻两个定时器值肯定也不一样。
仔细看一下数据手册里面应该有你这方便的应用介绍,具体1114的数据手册里有没有我还真不清楚,反正很多都有的。用一个定时器设定两个捕获就可以了,有些芯片可以在捕获中断里查看是上升沿或者是下降沿,那样就一个捕获就可以了。
怎么设置成双边沿触发?我这样行不行
- /*********************************************************************************************************
- * Function Name: timer0Isr
- * Description: TIMER0 下降沿捕获中断处理函数
- * Input: 无
- * Output: 无
- * Return: 无
- *********************************************************************************************************/
- void timer0Isr(void)
- {
- TMR32B0IR=0x1f; //清除中断标志位
- flagALL = TMR32B0CCR;
- flags=flags+1;
-
- if(flagALL == 0x06)
- {
- flagDOWN=TMR32B0CR0;
- TMR32B0CCR=0x05;
- flagsd=flagsd+1;
- if(flags==1)
- {
- flagLOW=flagLOW+flagDOWN;
- }
- else
- {
- flagLOW=flagLOW+(flagDOWN-flagUP);
- }
- }
- if(flagALL == 0x05)
- {
- flagUP=TMR32B0CR0;
- TMR32B0CCR=0x06;
- flagsu=flagsu+1;
-
- }
- return;
- }
- /*********************************************************************************************************
- ** Function name: timer0Init
- ** Descriptions: 32位定时器0初始化函数
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- void timer0Init (void)
- {
- SYSAHBCLKCTRL |= (1ul << 9); // 打开定时器模块
- TMR32B0PR =480-1; // 设置分频系数
- IOCON_PIO1_5 &= ~0x07; //初始化捕获引脚
- IOCON_PIO1_5 |=0x02;
- TMR32B0CCR = 0x05; // 设置CAP0.0上升沿捕获
- TMR32B0TC = 0;
- zyIsrSet(NVIC_TIMER32B0, (unsigned long)timer0Isr, PRIO_ONE); // 设置外部中断并使能
- TMR32B0TCR=0x01; //启动定时器
- }
复制代码我改成一个定时器进行捕获的了,但是发现这样做,和我用采样得来的数据还是相差较大的,有什么办法可以减少这种误差吗
我采样使用的计数方法是:一定时间内,当采样得到的值小于定值的时候,就记一次,最后把记的总次数除以定时,得到占空比
一周热门 更多>