我写了个编码器的程序
输入捕捉和定时器程序
- 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);
- }
转速值一开始为74转,目标值不管设大设小,实际转速值都变小。各位大神看看,哪里错了?谢谢!
编码器一圈产生1000个脉冲。
忘了发大循环程序了:
- 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);
- }
- }
|