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