一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 7859|回复: 9
收起左侧

[51单片机] 电动车巡航定速器——灰灰玩51单片机之处女作

[复制链接]
发表于 2012-5-1 11:58 | 显示全部楼层 |阅读模式
本帖最后由 灰太狼8888 于 2012-5-1 12:20 编辑

说实话,灰灰一开始没打算接触单片机,因为依照上学时对单片机的认知,编程是一项非常复杂的劳动,要写代码(汇编),查机器码,手动输入机器码……
后来因为中了考拉的毒,收了不少垃圾,其中不乏缺少遥控器的电子产品,想到利用单片机模拟红外编码,来实现未知红外编码设备的解码(枚举法)以及控制。从那时候起,开始关注单片机。翻看考老师的帖子《考拉聊单片机》,发现51单片机,尤其是STC的51,编程并不是原来认识的那么复杂,而且可以买一块开发板,用起来非常方便,用c语言就可以编程,计算机串口就可以下载,太好了!
接着就和大家一样,购买51学习板,学习郭天祥的视频教程,本以为自己上学时学的C语言这辈子就再无用武之地的,没想到现在竟然用上了,虽然只是学了个皮毛,好在单片机上用到的程序并不复杂。
以上因遥控器而起,但遥控器始终还是没有着手做。

先从简单的来,仿制电子钟,为自己的成功而兴奋不已,于此同时单片机、晶振、1602、12864、19264等各种硬件、单片机相关电路板也没少买,有些疯狂,就好像现在不买明天就没有卖的了,或许是我们这类人的通病吧。

真正意义上的第一件作品是为了改造我的电动车。人家的电动车都有定速巡航,而我的却没有,上网查阅资料才发现,该品牌的电动车只有高档型号才带有定速巡航功能,我晕,满大街的山寨电动车都有的定速巡航功能,竟然在某品牌的低档型号车型中被咔嚓了,实在不爽。既然在学习单片机,何不自己开发一套控制器呢?

说干就干,先是确定方案。
(1)电动车的转把是通过霍尔元件来产生一个电压信号来驱动控制器工作的,随着电压的升高,控制器使电动车速度加快。这需要AD DA转换,暂时还没学习相关的知识,并且手上也没有相关的硬件,先放弃这个方案。(其实这个方案是最接近电动车自带的定速巡航功能的)
(2)目前电动车大多都是带有助力功能,踏动脚踏板转动中轴,通过链条带动后轮旋转,同时中轴上的霍尔元件捕捉转速脉冲信号,提供给控制器,控制器根据脉冲信号的快慢控制电动车行驶速度的快慢。实际上这是一个伪助力,霍尔元件获得的根本不是受力情况,而是中轴的转速,当控制器按照这个脉冲驱动电动车行进时,链条根本赶不上电机的转动,人根本没对电动车的行进做功,只是提供转速脉冲而已。

既然这样,何不去掉霍尔元件,利用单片机发出不同频率的脉冲来命令控制器去控制电机的快慢,变相达到对定速的控制?

经过试验电动车控制器对二分之一占空比的脉冲无反应,但对于我手动通断助力信号线与地线的连接却有反应。难道是占空比问题?后来修改程序调整为0.75占空比,驱动成功!


以下是程序,灰灰是初学,并不完善,欢迎大家拍砖



  1. ///////////////////////////////////////////////////
  2. ///////// 电 动 车 定 速 巡 航 控 制 器 /////////////
  3. ///////// 版权归yleee论坛 灰太狼8888 所有 ///////////
  4. ///////// 版本号 2.0 2012年5月1日 /////////////////
  5. //////////////////////////////////////////////////

  6. #include <reg52.h>//包含头文件
  7. #define uchar unsigned char//0到255
  8. #define uint unsigned int//0到65535

  9. uchar start,stop;
  10. uint speed,speed1,t0,t1;

  11. /******输出******/
  12. sbit LED=P3^5;//定义工作指示灯
  13. sbit out=P3^3;//定义输出接口
  14. sbit beep=P3^7;//定义蜂鸣器接口

  15. /******输入******/
  16. sbit key1=P1^1;//+
  17. sbit key2=P1^3;//-
  18. sbit key3=P1^5;//开始/停止
  19. sbit key4=P1^7;//刹车

  20. /******函数声明******/
  21. void delay(uint x); //声明延时函数


  22. void main()
  23. {

  24. /******初始化******/
  25. speed=10;//设置速度初值
  26. speed1=(500/speed);
  27. key1=1;
  28. key2=1;
  29. key3=1;
  30. key4=1;
  31. start=0;
  32. t0=0;
  33. t1=0;
  34. TMOD=0x03;
  35. TH0=TL0=(256-156);
  36. EA=1;
  37. ET0=1;
  38. TR0=1;


  39. /******开机提示音******/
  40. delay(30000);
  41. delay(30000);
  42. beep=0;
  43. delay(10000);
  44. beep=1;
  45. delay(10000);
  46. beep=0;
  47. delay(10000);
  48. beep=1;
  49. delay(30000);


  50. /********防呆********/

  51. //需要开机提示音之后按住刹车,定速器才开始工作。避免默认开启,别人借用电动车不熟悉用法造成危险。
  52. while(key4)
  53. {
  54. while(1);
  55. }//开机提示音后按刹车,定速器有效,并发出提示音


  56. beep=0;
  57. delay(2000);
  58. beep=1;
  59. delay(2000);
  60. beep=0;
  61. delay(2000);
  62. beep=1;
  63. delay(60000);


  64. /********主体********/

  65. while(1)
  66. {
  67. if(key1==0)//加 键
  68. {
  69. delay(100);
  70. if(key1==0)
  71. {
  72. speed++;
  73. beep=0;//
  74. delay(1500);//加操作音效
  75. beep=1;//
  76. if(speed==60)
  77. { speed--;
  78. delay(1500);
  79. beep=0;//
  80. delay(4500);//加报错音效
  81. beep=1;//
  82. delay(10000);
  83. }
  84. speed1=(1000/speed);
  85. delay(7000);
  86. }
  87. }



  88. if(key2==0)//减键
  89. {
  90. delay(100);
  91. if(key2==0)
  92. {
  93. speed--;
  94. beep=0;//
  95. delay(3000);//减操作音效
  96. beep=1;//
  97. if(speed==1)
  98. {
  99. speed++;
  100. delay(1500);
  101. beep=0;//
  102. delay(4500);//减报错音效
  103. beep=1;//
  104. delay(10000);
  105. }
  106. speed1=(1000/speed);
  107. delay(7000);



  108. }
  109. }


  110. if(key3==0)//开始/暂停键
  111. {
  112. delay(100);
  113. if(key3==0)
  114. {
  115. start=!start;
  116. beep=0;//
  117. delay(10000);//
  118. beep=1;//
  119. }

  120. while(key3==0);
  121. }

  122. if(key4==0)//刹车
  123. {
  124. delay(100);
  125. while(key4==0)
  126. {
  127. beep=0;
  128. start=0;

  129. }
  130. beep=1;
  131. }

  132. }

  133. }

  134. void delay(uint x)
  135. {
  136. uint i; //x为延时长度,可以设置
  137. for(i=0;i<2*x;i++);
  138. }



  139. void timer0() interrupt 1
  140. {
  141. if (start)
  142. {
  143. t0++;
  144. if(t0>=speed1)
  145. {
  146. t0=0;
  147. t1++;
  148. if (t1>=4)
  149. {
  150. LED=0;
  151. out=0;
  152. t1=0;

  153. }
  154. else
  155. {
  156. LED=1;
  157. out=1;
  158. }

  159. }
  160. }
  161. else
  162. {
  163. LED=1;
  164. out=1;
  165. }

  166. }

复制代码




程序中设有防呆(需要开机提示音之后按住刹车,定速器才开始工作。避免默认开启,别人借用电动车不熟悉用法造成危险),刹车停止驱动等安全措施。

程序中带有仿真文件

电动车控制器.rar (47.03 KB, 下载次数: 1064)

IMG_1700.jpg
IMG_1702.jpg
---------------------------------------------
鸣谢

感谢 王老板 为我们提供这个交流的空间
感谢 cosine(考拉)提供51单片机实验板及相关教程https://www.yleee.com.cn/search.php?searchid=65&orderby=lastpost&ascdesc=desc&searchsubmit=yes
感谢 阳光999、快活丞、没事瞎转悠 等坛友提供程序上的帮助https://www.yleee.com.cn/viewthread.php?tid=11163&fromuid=4613
感谢 郭天祥 分享的《十天学会单片机和C语言编程》视频教程

评分

参与人数 3一乐金币 +60 收起 理由
倪大德 + 20 原创首发支持一下!
lsnes + 20 想得周到,我上次骑同事的一辆电动车带定速 ...
fujiachun + 20 感谢红红的平底锅

查看全部评分

发表于 2012-5-1 12:10 | 显示全部楼层
呵呵,沙发.不好意思,不知道定速器是什么东东,能解释一下吗?
 楼主| 发表于 2012-5-1 12:15 | 显示全部楼层
呵呵,沙发.不好意思,不知道定速器是什么东东,能解释一下吗?
MJG365 发表于 2012-5-1 12:10 https://www.yleee.com.cn/images/common/back.gif



    定速巡航,不用一直扭着转把。大多数电动车本身带此功能。
发表于 2012-5-1 15:07 | 显示全部楼层
发表于 2012-5-1 18:53 | 显示全部楼层
不错的,支持下!
发表于 2012-5-1 19:34 | 显示全部楼层
对于成品控制器的定速巡航功能,用单片机替代,是一个非常可行的方法,但是,楼主的方法实现起来既吧方便,又不防呆,只能作为实验用用。
其实真正完全替代实现起来非常容易,这里首先选用的单片机必须有DA/AD功能,在这个前提下,实现的逻辑如下:
选择一个IO口作为功能选择跳线,该跳线,在上电时候检测,可以做到开通或者取消巡航功能。
接着,就是用一个AD口,采样转把霍尔电压,巡航的原则是按照一个固定时间,如果采样的时间电压在一个范围里面,认为启动定速巡航功能,此时,另外一个DA端口,输出一个刚才采样的数据的平均值,作为巡航速度控制电压,送电动车控制器。
非巡航状态,那就是AD采样值,直接传送到DA输出到控制器,达到实时控制电动车速度的目的。
巡航状态,必须有一个智能判断终止,进入普通控制模式,因此,系统必须另外引入刹车信号,巡航退出条件为:
1、因为进入定速巡航,电动车调速转把肯定是回到零位,因此,一旦检测到调速转把转动过一定角度(调速电压上升到一定值),就认为是驾驶员需要开启人工控制,则立刻退出巡状态,进入人工控制。
2、进入定速巡航,一旦检测到刹车信号,立刻退出定速巡航,进入人工控制。
MCU上述功能实现非常简单,除了DA输出的PWM积分滤波缓冲输出需要几个外围电路,其他外围基本上不需要什么线路,IO口加一个保护电阻就可以直接接入电动车。
上面说明的,其实已经很明确需要接入几个信号了:1转把电压,2刹车信号,3输出到控制器原转把控制信号,4启停巡航功能的跳线。
 楼主| 发表于 2012-5-1 21:06 | 显示全部楼层
对于成品控制器的定速巡航功能,用单片机替代,是一个非常可行的方法,但是,楼主的方法实现起来既吧方便, ...
天行健 发表于 2012-5-1 19:34 https://www.yleee.com.cn/images/common/back.gif



    非常感谢您的指点,上文中我已经提到了,您提到的这个是我的第一个方案,也是最接近原始控制器的方案。最终被否定的原因是因为能力所限,还有就是硬件的限制,因为还是初学者,不知道需要哪些芯片,也没有系统的学习。手上只有几片拆机芯片。就目前而言,只能退而求其次。等我深入学习,有条件进行AD DA试验的时候,还请您多多指教。谢谢您对我的指点
发表于 2012-5-1 22:31 | 显示全部楼层
电动车巡航定速器
发表于 2012-5-2 21:37 | 显示全部楼层
将想法变成现实
发表于 2012-5-11 13:36 | 显示全部楼层
好啊。这就是知行合一。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-6-10 23:20 , Processed in 0.076294 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表