采用vscode进行编程,使用MsTimer2和pid库,串口绘图器采用“纸飞机”,纸飞机软件不要更新,否则会导致收费;电机闭环只做了正转闭环,
电机测速
void read_quadrature_A() //编码器脉冲计数中断函数
{
if (digitalRead(ENCODER_A_PIN) == LOW)
{
if (digitalRead(ENCODER_B_PIN) == LOW) // 查询EN_B的电平以确认正转
{ pulse_number ++; }
if (digitalRead(ENCODER_B_PIN) == HIGH) // 查询EN_B的电平以确认反转
{ pulse_number --; }
}
else {
if (digitalRead(ENCODER_B_PIN) == HIGH) // 查询EN_B的电平以确认正转
{ pulse_number ++; }
if (digitalRead(ENCODER_B_PIN) == LOW) // 查询EN_B的电平以确认反转
{ pulse_number --; }
}
}
attachInterrupt(0, read_quadrature_A, CHANGE); //EN_A脚下降沿触发中断
如果想进行4倍频计数,需要加上
void read_quadrature_B() //编码器脉冲计数中断函数
{
if (digitalRead(ENCODER_B_PIN) == HIGH)
{
if (digitalRead(ENCODER_A_PIN) == LOW) // 查询EN_A的电平以确认正转
{ pulse_number ++; }
if (digitalRead(ENCODER_A_PIN) == HIGH) // 查询EN_A的电平以确认反转
{ pulse_number --; }
}
else{
if (digitalRead(ENCODER_A_PIN) == HIGH) // 查询EN_A的电平以确认正转
{ pulse_number ++; }
if (digitalRead(ENCODER_A_PIN) == LOW) // 查询EN_A的电平以确认反转
{ pulse_number --; }
}
}
attachInterrupt(1, read_quadrature_B, CHANGE); //EN_B脚上升沿触发中断
然后利用定时器40ms记一次 pulse_number 数,从而得到转速
pid
利用pid库,将转速输入pid库,调节pid,将输出给pwm引脚
pid调节后转速图
代码和图形化软件在
作者:杨开印