Arduino - 电动车转把线加装定速巡航功能

#define Pin_btn 5 // 巡航按钮输入针脚
#define Pin_in A0 // 转把电压信号输入针脚(接转把转速信号线-绿线)
#define Pin_out 11 // 巡航电压输出针脚(接控制器转速信号线)
bool xunhang = false; // 当前是否正在巡航中

void setup() {
  pinMode(Pin_btn,INPUT_PULLUP); // 启用按钮上拉电阻
  pinMode(Pin_in,INPUT);
  pinMode(Pin_out, OUTPUT);  
  // 使用快速PWM输出,让电机转的更平稳,以下2A、2B系列仅对3针、11针有效。
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);  
  TCCR2B = _BV(CS22);  
  OCR2A = 180;  
  OCR2B = 50;  
}
void loop() {
  int inv = analogRead(Pin_in); // 读入转把电压,PWM读入最大1023。模拟接口能够测量0-5V的电压,对应的返回值为0-1023
  int outv = map(inv,0,1023,0,300); // 将转把输入电压进行转换,以符合模拟输出取值范围(0-1023转为0-255,为了得到稳定的全速电压,转为0-300后再将溢出的最大值裁切掉)
  if ( outv<110 ) {outv=0;}  // 折合最小输出电压(启动电压)2.15V,得到稳定的启动电压。 
  if ( outv>230) {outv=230;} // 折合最大输出电压(全速电压)4.5V,得到稳定的全速电压
  if ( digitalRead(Pin_btn)==LOW ){ // 巡航按钮按下,开始巡航
      if ( xunhang==false and outv>0 ){ // 如果未巡航,且转把有电压,就开始巡航
        xunhang = true;
        analogWrite(Pin_out,outv); // 发送当前速度电压
      } 
  } else { // 巡航按钮松开,结束巡航
    xunhang = false; // 设置为未巡航
    analogWrite(Pin_out,outv); // 发送当前速度电压
  }
  delay(10);
}

原理是通过“拦截”转把转速信号电压值,分析处理后,再传送给控制器,达到自由控制电机转速的目的。

1、单片机5V供电从转把转速控制三线中获取(接转把黑线,红线)。

2、将转把转速信号线(绿线)接单片机A0,用于获取转把转速信号电压值,以便设置“控制器”转速。

3、将控制器转速信号线(绿线)接单片机11,用于设置控制器当前转速。

4、将11针PWM输出频率加快,用于给控制器输出平稳的电压信号,让电机转的更丝滑。

如果使用ATtiny13A芯片,需要把8分频关闭,不然电机转动不起来。代码如下:

// 电动车定速巡航改装,通过截取车把速度电压信号线实现

// UNO、NANO
// #define Pin_btn 5 // 巡航按钮输入针脚
// #define Pin_in A0 // 转把电压信号输入针脚(接转把转速信号线-绿线)
// #define Pin_out 11 // 巡航电压输出针脚(接控制器转速信号线)

// ATTiny13A
#define Pin_btn 3 // 巡航按钮输入针脚
#define Pin_in A2 // 转把电压信号输入针脚(接转把转速信号线-绿线)
#define Pin_out 1 // 巡航电压输出针脚(接控制器转速信号线)

bool xunhang = false; // 当前是否正在巡航中

void setup() {
  pinMode(Pin_btn,INPUT_PULLUP); // 启用按钮上拉电阻
  pinMode(Pin_in,INPUT);
  pinMode(Pin_out, OUTPUT);  
  // 使用快速PWM输出,让电机转的更平稳,以下2A、2B系列仅对3针、11针有效。
  // TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);  
  // TCCR2B = _BV(CS22);  
  // OCR2A = 180;  
  // OCR2B = 50;  
}
void loop() {
  int inv = analogRead(Pin_in); // 读入转把电压,PWM读入最大1023。模拟接口能够测量0-5V的电压,对应的返回值为0-1023
  int outv = map(inv,0,1023,0,300); // 将转把输入电压进行转换,以符合模拟输出取值范围(0-1023转为0-255,为了得到稳定的全速电压,转为0-300后再将溢出的最大值裁切掉)
  if ( outv<110 ) {outv=0;}  // 折合最小输出电压(启动电压)2.15V,得到稳定的启动电压。 
  if ( outv>230) {outv=230;} // 折合最大输出电压(全速电压)4.5V,得到稳定的全速电压
  if ( digitalRead(Pin_btn)==LOW ){ // 巡航按钮按下,开始巡航
      if ( xunhang==false and outv>0 ){ // 如果未巡航,且转把有电压,就开始巡航
        xunhang = true;
        analogWrite(Pin_out,outv); // 发送当前速度电压
      } 
  } else { // 巡航按钮松开,结束巡航
    xunhang = false; // 设置为未巡航
    analogWrite(Pin_out,outv); // 发送当前速度电压
  }
  delay(10);
}

你可能感兴趣的:(Arduino,单片机,嵌入式硬件)