我正在开发直流电机的控制。该电机有一个编码器,可根据其运动产生脉冲。
我需要通过监控脉冲数来控制电机轴的转数。
我为此应用程序使用 SMT8S103F3。
这个想法是使用 Timer1 作为脉冲计数器。为此,我将定时器配置为接收外部信号,在这种情况下是编码器脉冲,并且每个脉冲都必须增加计数器。
我遵循文档 ST RM0016 第 17.4.3 章。但是该应用程序无法正常工作。计数器不递增。
遵循开发的代码。
void config_counter(){
TIM1_PSCRH = 0;
TIM1_PSCRL = 0; //Prescalar 1 division
TIM1_ARRH = 0;
TIM1_ARRL = 0; //Auto counter disabled
TIM1_CNTRH = 0;
TIM1_CNTRL = 0; //Reset counter
TIM1_IER = 0; //Interrupt disabled
TIM1_SR1 = 0; //Clear Interrupt
TIM1_CCMR2 |= 1<<0; //External pulse source T1C2
TIM1_CCER1 |= ~(1<<5); //Rising edge
TIM1_SMCR |= 3; //T1C2 input
TIM1_CR1 |= ~(1<<0); //Counter disabled
return;
}
void set_counter_enable(uint8_t enable){
if(enable==1)
TIM1_CR1 |= 1<<0;
else
TIM1_CR1 |= ~(1<<0);
return;
}
void set_counter_updown(uint8_t updown){
if(updown==1)
TIM1_CR1 |= ~(1<<4);
else
TIM1_CR1 |= 1<<4;
return;
}
uint8_t start_movement_monitor(uint8_t dir){
while(1){
if(dir == 1){
if(((TIM1_CNTRH<<8)+TIM1_CNTRL)>200)
return 1;
}else if(dir == 2){
if(((TIM1_CNTRH<<8)+TIM1_CNTRL)<50)
return 1;
}
else{
return 1;
}
}
return 1;
}
int main() {
config_gpio();
config_counter();
set_counter_updown(0);
set_counter_enable(0);
set_counter_enable(1);
set_motor_enable(1);
set_motor_movement(1);
start_movement_monitor(1);
set_motor_movement(0);
set_motor_enable(0);
set_counter_enable(0);
return 0;
}
有任何想法吗?
如果定时器不是该应用的最佳选择,那么如何实现脉冲计数器?
脉冲频率为 700kHz。