我写了个编码器的程序
输入捕捉和定时器程序
`GPIO_Config_T gpioConfig;
TMR_BaseConfig_T baseConfig;
TMR_ICConfig_T ICConfig;
BOARD_LEDInit(LED2);
BOARD_LEDInit(LED3);
BOARD_LEDOff(LED2);
BOARD_LEDOff(LED3);
/* Enable GPIOA Periph Clock */
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
/* Config GPIO */
gpioConfig.pin = GPIO_PIN_12 | GPIO_PIN_13;
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.speed = GPIO_SPEED_100MHz;
gpioConfig.otype = GPIO_OTYPE_OD;
gpioConfig.pupd = GPIO_PUPD_UP;
GPIO_Config(GPIOD,&gpioConfig);
gpioConfig.pin = GPIO_PIN_6;
gpioConfig.mode = GPIO_MODE_OUT;
gpioConfig.speed = GPIO_SPEED_100MHz;
gpioConfig.otype = GPIO_OTYPE_PP;
gpioConfig.pupd = GPIO_PUPD_NOPULL;
GPIO_Config(GPIOD,&gpioConfig);
/* Config GPIOA Alernate Function for TMR1 */
GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_12,GPIO_AF_TMR4);
GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_13,GPIO_AF_TMR4);
/* Enable TMR1,TMR2 Periph Clock */
RCM_EnableAPB2PeriphClock(RCM_APB1_PERIPH_TMR4);
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);
/* Config TMR1 */
baseConfig.clockDivision = TMR_CLOCK_DIV_1;
baseConfig.countMode = TMR_COUNTER_MODE_UP;
baseConfig.division = DIV;
baseConfig.period = 0x0008;
baseConfig.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR4, &baseConfig);
/* Config TMR2 */
baseConfig.clockDivision = TMR_CLOCK_DIV_1;
baseConfig.countMode = TMR_COUNTER_MODE_UP;
baseConfig.division = DIV;
baseConfig.period = 9999;
baseConfig.repetitionCounter = 1;
TMR_ConfigTimeBase(TMR3, &baseConfig);
/* Encoder */
TMR_ConfigEncodeInterface(TMR4,TMR_ENCODER_MODE_TI1,TMR_IC_POLARITY_RISING,TMR_IC_POLARITY_RISING);
/* Input Capture */
ICConfig.channel = TMR_CHANNEL_1;
ICConfig.polarity = TMR_IC_POLARITY_RISING;
ICConfig.selection = TMR_IC_SELECTION_DIRECT_TI;
ICConfig.prescaler = TMR_IC_PSC_1;
ICConfig.filter = 0;
TMR_ConfigIC(TMR4,&ICConfig);
ICConfig.channel = TMR_CHANNEL_2;
TMR_ConfigIC(TMR4,&ICConfig);
/* Counter */
TMR_ConfigCounter(TMR4,0x0004);
TMR_ClearStatusFlag(TMR4,TMR_FLAG_UPDATE);
TMR_ClearStatusFlag(TMR3,TMR_FLAG_UPDATE);
/* Enable TMR1,TMR2 Interrupt */
TMR_EnableInterrupt(TMR4, TMR_INT_UPDATE);
TMR_EnableInterrupt(TMR3, TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR4_IRQn, 0, 0);
NVIC_EnableIRQRequest(TMR3_IRQn, 0, 0);
/* Enable TMR1,TMR2 */
TMR_Enable(TMR4);
TMR_Enable(TMR3);
PWM();`
其中PWM()是产生PWM波的。
输入捕捉中断
void TMR4_IRQHandler(void)
{
if((TMR4->CTRL1_B.CNTDIR)!=0)
{
//encoderNum--;
encoderNum--;
}
else
{
encoderNum++;
}
//printf("encoderNum: %08x\r\n", encoderNum);
TMR_ConfigCounter(TMR4,0x0004);
TMR_ClearIntFlag(TMR4,TMR_FLAG_UPDATE);
}
定时器中断
void TMR3_IRQHandler(void)
{
if(TMR_ReadIntFlag(TMR3, TMR_INT_UPDATE) == SET)
{
tick++;
tick1++;
if(tick1>=800)
{
flag=1;
encoderNum1 = encoderNum;
encoderNum=0;
tick1=0;
BOARD_LEDToggle(LED2);
}
TMR_ClearIntFlag(TMR3, TMR_INT_UPDATE);
}
}
PWM波程序
`void PWM(void)
{
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1);
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA | RCM_AHB1_PERIPH_GPIOB | RCM_AHB1_PERIPH_GPIOE);
/* TMR1_CH1 */
GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_8, GPIO_AF_TMR1);
/* TMR1_CH2 */
/* Config TMR1 GPIO for complementary output PWM */
GPIO_ConfigStruct.pin = GPIO_PIN_7| GPIO_PIN_8;
GPIO_ConfigStruct.mode = GPIO_MODE_AF;
GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz;
GPIO_Config(GPIOA, &GPIO_ConfigStruct);
/* config TMR1 */
TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_TimeBaseStruct.division = DIV;
per1=1999;
TMR_TimeBaseStruct.period =per1;
TMR_TimeBaseStruct.repetitionCounter=0xff;
TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
/* Configure channel */
OCcongigStruct.mode = TMR_OC_MODE_PWM1;
OCcongigStruct.pulse = 1000;
OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;
OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;
OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;
OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;
OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;
OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;
TMR_ConfigOC1(TMR1, &OCcongigStruct);
OCcongigStruct.pulse = 1000;
TMR_ConfigOC2(TMR1, &OCcongigStruct);
TMR_Enable(TMR1);
TMR_EnablePWMOutputs(TMR1);
}大循环程序if(flag==1)
{
flag=0;
RotationSpeed=encoderNum1*60/1000;
if(RotationSpeed>RotationSpeed1)
{
per1-=10;
TMR_TimeBaseStruct.period = per1;
TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
}
else if(RotationSpeed<RotationSpeed1)
{
per1+=10;
TMR_TimeBaseStruct.period = per1;
TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
}
}`
转速值一开始为74转,目标值不管设大设小,实际转速值都变小。各位大神看看,哪里错了?谢谢!
编码器一圈产生1000个脉冲。