- 打卡等级:以坛为家I
- 打卡总天数:398
- 最近打卡:2026-04-02 08:30:39
已绑定手机
金牌会员
- 积分
- 1721
|
线路板是之前绘制的,现在增加了编码器输入,只能如下配置引脚:
/************* 功能说明 **************
PWMA模块工作于编码器模式
编码器A相输入: P2.4 PWM3P
编码器B相输入: P1.0 PWM1P
编码器模式, 模式3: 每个脉冲两个边沿加减
void PWMA_config(void)
{
u8 ps;
// 高阻输入 P1.0,P1.1
P1M0 = 0x00; P1M1 = 0x03;
// 高阻输入 P2.2,P2.3,P2.4
P2M0 = 0x00; P2M1 = 0x1c;
P_SW2 |= 0x80; //SFR enable
PWMA_ENO = 0; // IO输出禁止
PWMA_IER = 0; // 禁止中断
PWMA_SR1 = 0; // 清除状态
PWMA_SR2 = 0; // 清除状态
ps = 0;
PWMA_ISR_En = 0;
PWMA_PSCRH = 0; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMA_PSCRL = 0;
PWMA_ARRH = 0x7f; // 自动重装载寄存器, 控制PWM周期
PWMA_ARRL = 0xff;
PWMA_CNTRH = 0; //清零编码器计数器值
PWMA_CNTRL = 0;
PWMA_CCMR1 = 0x01+(10<<4); // 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
PWMA_CCMR2 = 0x01+(10<<4); // 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
PWMA_SMCR = 3; // 编码器模式, 模式1或模式2: 每个脉冲两个边沿加减2. 模式3: 每个脉冲四个边沿加减4.
PWMA_CCER1 = 0x55; // 配置通道输入使能和极性, 允许输入, 下降沿
PWMA_CCER2 = 0x55; // 捕获/比较使能寄存器2
ps |= 0; // PWM1P选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
//ps |= (1<<2); // PWM2P选择IO, 0:选择P5.4 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3,
ps |= (1<<4); // PWM3P选择IO, 0:选择P1.4 P1.5, 1:选择P2.4 P2.5, 2:选择P6.4 P6.5,
//ps |= (0<<6); // PWM4P选择IO, 0:选择P1.6 P1.7, 1:选择P2.6 P2.7, 2:选择P6.6 P6.7, 3:选择P3.4 P3.3
PWMA_PS = ps; // 选择IO
PWMA_ISR_En |= 0x02; // 使能中断
PWMA_IER = PWMA_ISR_En; // 设置允许通道1~4中断处理
PWMA_CR1 = 0x01; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数, bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
}
// PWMA_PS = (0<<6)+(0<<4)+(0<<2)+0; //选择IO, 4项从高到低(从左到右)对应PWM1 PWM2 PWM3 PWM4, 0:选择P1.x, 1:选择P2.x, 2:选择P6.x,
// PWMA_PS PWM4N PWM4P PWM3N PWM3P PWM2N PWM2P PWM1N PWM1P
// 00 P1.7 P1.6 P1.5 P1.4 P1.3 P5.4 P1.1 P1.0
// 01 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
// 02 P6.7 P6.6 P6.5 P6.4 P6.3 P6.2 P6.1 P6.0
// 03 P3.3 P3.4 -- -- -- -- -- --
void PWMA_ISR(void) interrupt PWMA_VECTOR
{
u8 sr1, sr2;
sr1 = PWMA_SR1; //为了快速, 中断标志用一个局部变量处理
PWMA_SR1 = 0; //清除中断标志
sr2 = PWMA_SR2; //为了快速, 中断标志用一个局部变量处理
PWMA_SR2 = 0; //清除中断重复标志
sr1 &= PWMA_ISR_En; //每个通道可以单独允许中断处理
if(sr1 & 0x02) //通道1 编码器1B边沿中断
{
Pulse = ((u16)PWMA_CNTRH << 8) + (u16)PWMA_CNTRL; //读取当前编码器计数值
B_Change = 1; //标志已有捕捉值
}
}
结果是,Pulse一直为0,不知道是哪里的问题?
我用示波器测量,P1.0,P2.4端口脉冲输入正常
请教大家帮忙看看,是不是PWMA编码器模式不支持PWM3P,PWM4P呀?
|
|