我想捕获P1.0和P1.2两个引脚上的PWM高电平宽度,并打印出来。以下是我的部分代码。哪位大神帮忙看一下这样写行吗?看看有没有多余或缺少了哪些语句。因这我对高级PWM不熟悉。
//======================== 主函数 ========================
void main(void)
{
P_SW2 |= 0x80;
// P1.0 P1.2 高阻输入
P1M1 |= 0x05;
P1M0 &= ~0x05;
PWMA_Capture_Init();
Uart1_Init();
EA = 1;
while (1)
{
if (B_Capture1)
{
B_Capture1 = 0;
g_high_p10 = CCAP1_Time; // 单位:us
}
if (B_Capture2)
{
B_Capture2 = 0;
g_high_p12 = CCAP2_Time;
}
// 打印
Uart1_SendString("P1.0=");
u16_to_str(g_high_p10);
Uart1_SendString("us ");
Uart1_SendString("P1.2=");
u16_to_str(g_high_p12);
Uart1_SendString("us\r\n");
delay_ms(200);
}
}
//======================== PWMA 捕获初始化 ========================
void PWMA_Capture_Init(void)
{
P_SW2 |= 0x80;
PWMA_CCER1 = 0;
PWMA_SR1 = 0;
PWMA_IER = 0;
PWMA_ENO = 0;
// 11.0592MHz 12分频 = 1us 精度
PWMA_PSCR = 11;
PWMA_ARR = 0xFFFF;
// ========= 通道1:P1.0 上升/下降沿都捕获 =========
PWMA_CCMR1 = (3 << 4) | 0x01; // 输入模式 + 滤波
PWMA_CCER1 |= 0x01; // 先上升沿
PWMA_CCER1 |= 0x03; // 双边沿捕获
// ========= 通道2:P1.2 上升/下降沿都捕获 =========
PWMA_CCMR2 = (3 << 4) | 0x01;
PWMA_CCER1 |= 0x10;
PWMA_CCER1 |= 0x30;
PWMA_PS = 0x00; // 必须00:P1.0 P1.2
PWMA_IER = 0x06; // 通道1 + 通道2 中断
PWMA_EGR = 0x01;
PWMA_CR1 |= 0x01;
}
//======================== PWMA 中断 ========================
void PWMA_ISR(void) interrupt 26
{
u16 j;
u8 sr;
sr = PWMA_SR1;
PWMA_SR1 = 0;
// -------- P1.0 测高电平 --------
if (sr & 0x02)
{
j = PWMA_CCR1;
CCAP1_Time = j - CCAP1_tmp;
CCAP1_tmp = j;
B_Capture1 = 1;
}
// -------- P1.2 测高电平 --------
if (sr & 0x04)
{
j = PWMA_CCR2;
CCAP2_Time = j - CCAP2_tmp;
CCAP2_tmp = j;
B_Capture2 = 1;
}
}
打印出来的结果是这样的,感觉不对。

实际波形是这个的。
