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

本文介绍了一种使用单片机实现电动车巡航控制的方法。通过读取转把的电压信号,经处理后发送给控制器以调整电机转速。特别介绍了如何通过软件设置合适的输出电压以确保电机平稳运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值