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