|
最近用M054LAN芯片作一板子,主体功能均编写结束!
测试中发现有一问题,在采用PWMB组对外部LC振荡信号进行捕捉脉冲宽度时,设计要求是检测单个周期长度并由PWM A组输出捕捉到的同频信号.结果发现输入二个信号周期才输出一个周期!用DEBUG在线调试,检测发现PWM B组的捕捉所得数值经计算为输入信号二个周期的长度,可证实为输入信号捕捉出错了,为查清原因,测量了波形图,输入信号没有问题.可确定为软件问题,在PWM的B组捕捉上出问题了!经查程序未能找出问题所在!
请诸位大侠帮忙介绍一下, 有哪些原因会引起PWM 脉宽 捕捉错误!
下附波形图和程序的PWM配置部分!
下载 (45.47 KB)
2012-1-12 21:57
CH1为捕捉输入信号
CH2为同步的输出信号
以下附PWM配置部分的程序:
void PWM_CAP_Init(void)
{
P2_MFP = P2_MFP & (~(P25_AD13_PWM5 )) | PWM5 ; //配置P2.5PWM
IPRSTC2 |= PWM47_RST; //复位PWM模块
IPRSTC2 &= ~PWM47_RST; //PWM模块从复位状态恢复到正常工作状态
P2_PMD &= ~Px5_PMD;
P2_PMD |= Px5_QB;
APBCLK |= PWM45_CLKEN; //使能PWM45和PWM67时钟
CLKSEL2 = CLKSEL1 & (~(PWM45_CLK));
CLKSEL2 |= PWM45_HCLK; //选择HCLK作为PWM45
PPRB |= 0x00000101; //Select PWM4,5 and pWM6,7 PWM预分频器(1,不分频,2个时钟分频器共用一个16位)
CSRB |= (CSR1_CLK_1); //分频系数(不分频,同频模式下,组只定义偶数的时钟)
PCRB |= CH1_AU_RL; //自动重装最大计数值
CNR1B = 65535; //最大计数值 脉宽等于 65535+1-触发锁存值()上升沿或下降沿
CCR0B |= CFL_IE1; //捕捉中断使能,CFL_IF1为下降沿
// CCR0B |= CRL_IE1; //CRL_IE1为上升沿
//CCR0B |= INV1_ON; //输入取反打开
CAPENRB |= CAPCH1_ON; //Enable Capture1 channel input valid
PIERB |= PWMIE1; //PWM5中断使能
NVIC_ISER |= PWMB_INT; //使能NVIC PWM_INT中断
CCR0B |= CAPCH1EN; // PWM B组通道1脉宽计数使能
POEB &= ~(PWM5_OE); //PWM5关闭输出
PCRB |= (CH5EN); // 使能CAPENR 定时器使能比特,应用时打开
}
void PWMB_IRQHandler(void) //PWM中断,检测周期 ,脉宽捕捉
{
volatile static uint16_t uiLow_Pulse, uiHigh_Pulse;
volatile uint32_t u32status;
PIIRB &= PIIRB;//PWMIF5 | PWMIF4;
u32status = CCR0B;
CCR0B |= CAPIF1; //Capture1 flag clearing by writing "1"
/* if(u32status & CRLRI1)
{
uiLow_Pulse = CNR1B - CRLR1B; // CRLR1 上升沿锁存寄存器
CCR0B |= CRLRI1;
} // */
if(u32status & CFLRI1)
{
TCAP1 = CNR1B - CFLR1B; //CFLR1 下降沿锁存寄存器
CCR0B |= CFLRI1;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|