void PWMA_init(void)
{
P2M0 &=~0X05;
P2M1 &=~0X05;
PWMA_PS = 0X0a;//选择P20 P22输入捕获引脚
PWMA_PSCRH = 0X00;
PWMA_PSCRL = 0X00;
PWMA_ARRH =0XFF;
PWMA_ARRL = 0XFF;
PWMA_CNTRH = 0;
PWMA_CNTRL = 0;
PWMA_SMCR = 0X02;
PWMA_CCMR1 = 0x01+(10<<4);//0xa0
PWMA_CCMR2 = 0x01+(10<<4);
PWMA_SMCR = 0X03;
PWMA_CCER1 = 0X33;//使能输入捕获
PWMA_CCER2 = 0X33;
//PWMA_IER = 0X06;
PWMA_CR1 |=0X01;
}
void PWMB_init(void)
{
P0M0 &=~0X0a;
P0M1 &=~0X0a;//设置捕获输入为准双向口
PWMB_PS=0X00;//P01 P03输入捕获引脚
PWMB_PSCRH = 0X00;
PWMB_PSCRL = 0X00;
PWMB_ARRH = 0XFF;
PWMB_ARRL = 0XFF;
PWMB_CNTRH = 0X00;
PWMB_CNTRL = 0X00;
PWMB_SMCR = 0X03;//02是只捕获一路,03是捕获两路
PWMB_CCMR1 = 0x01+(10<<4);
PWMB_CCMR2 = 0x01+(10<<4);
PWMB_SMCR = 0X03;
PWMB_CCER1=0X33;
PWMB_CCER2=0X33;
PWMB_CR1 |= 0X01;
}
uint16_t encoder_dataA,encoder_dataB;
SYS_Init();
PWMB_init();
PWMA_init();
printf("Hello World !\n");
while (1)
{
if(flag)
{
encoder_dataB=(PWMB_CNTRH<<8)+PWMB_CNTRL;
encoder_dataA=(PWMA_CNTRH<<8)+PWMA_CNTRL;
if(encoder_dataA)
printf("encoder_dataA = %d\n",encoder_dataA);
if(encoder_dataB)
printf("encoder_dataB = %d\n",encoder_dataB);
flag=0;
}
}
- 使用的时候,使用一个定时器定时去读取寄存器的值即可。这个代码经过测试,可以同时捕获两路正交编码器的值。在AI8051U上.只需要修改PWMB_PS,PWMA_PS选择对应的管脚,即可实现对应IO输入捕获,只有PWMA_1P PWMA_2P 这两个可以捕获一路正交编码器信号。PWMB_5P,PWMB_6P这两个可以捕获一路正交编码器信号。
- 使用两路正交编码器以后,就不能再使用PWMA和PWMB做PWM输出了。