飞思卡尔中断处理方法

飞思卡尔中断处理方法
飞思卡尔中断处理方法

飞思卡尔智能车总结之中断的处理方法

对于我这个学计算机软件的人,来写单片机的程序,还真的是由不少困难。最近一直在看freescale的程序规范,真的是很纠结。我全部的硬件编程经验不过是去年硬件小学期的vhdl 程序,在试验箱上捣鼓捣鼓程序逻辑,就这点。本来就忘的差不多了,况且它与单片机的模式还有很多区别。所以啊``忍之,忍之,全当自我挑战了。

机械部分和电路部分完成,接下来该做的软件调试和综合测试。

我得累了。

今天遇到了一个关于中断怎么写的问题,纠结了很久,总结一下:

标准的程序段是这样的格式:

[c-sharp]view plaincopyprint?

1. #pragma CODE_SEG __NEAR_SEG NON_BANKED //中断函数置于非分

页区内

2. interrupt VectorNumber_Vtimch7 void ICU_Ch7Int(void)

3. {

4. TFLG1_C7F = 1; //清中断标志位

5. }

6. #pragma CODE_SEG DEFAULT //后续代码置于默认区域内

一般是用上述方式声明中断函数。

由于飞思卡尔16位单片机的中断向量是16位,所以中断函数只有被置于非分页区内才能被寻址到,这就是第一行的作用。

第二行中“VectorNumber_Vtimch7”是中断号,它是由文件“MC9S12XS128.h”中定义的宏,这个中断号在它的技术手册中找到,但是我建议你采用这种宏的形式,因为这个宏不容易出错,可读性较高,比如“VectorNumber_Vtimch7”即为定时器(TIM)通道7(CH7)所对应的中断号。中断函数名“ICU_Ch7Int”可任意取,没有影响。

由于单片机内部非分页区大小有限,非中断函数一般置于分页区内,最后一行即为此作用。

令:MC9S12XS128.h中的宏定义是这样的:

[cpp]view plaincopyprint?

1. /**************** interrupt vector numbers ****************/

2. #define VectorNumber_Vsi 119

3. #define VectorNumber_Vsyscall 118

4. #define VectorNumber_VReserved118 117

5. #define VectorNumber_VReserved117 116

6. #define VectorNumber_VReserved116 115

7. #define VectorNumber_VReserved115 114

8. #define VectorNumber_VReserved114 113

9. #define VectorNumber_VReserved113 112

10. #define VectorNumber_VReserved112 111

11. #define VectorNumber_VReserved111 110

12. #define VectorNumber_VReserved110 109

13. #define VectorNumber_VReserved109 108

14. #define VectorNumber_VReserved108 107

15. #define VectorNumber_VReserved107 106

16. #define VectorNumber_VReserved106 105

17. #define VectorNumber_VReserved105 104

18. #define VectorNumber_VReserved104 103

19. #define VectorNumber_VReserved103 102

20. #define VectorNumber_VReserved102 101

21. #define VectorNumber_VReserved101 100

22. #define VectorNumber_VReserved100 99

23. #define VectorNumber_VReserved99 98

24. #define VectorNumber_VReserved98 97

25. #define VectorNumber_Vatd0compare 96

26. #define VectorNumber_VReserved96 95

27. #define VectorNumber_VReserved95 94

28. #define VectorNumber_VReserved94 93

29. #define VectorNumber_VReserved93 92

30. #define VectorNumber_VReserved92 91

31. #define VectorNumber_VReserved91 90

32. #define VectorNumber_VReserved90 89

34. #define VectorNumber_VReserved88 87

35. #define VectorNumber_VReserved87 86

36. #define VectorNumber_VReserved86 85

37. #define VectorNumber_VReserved85 84

38. #define VectorNumber_VReserved84 83

39. #define VectorNumber_VReserved83 82

40. #define VectorNumber_VReserved82 81

41. #define VectorNumber_VReserved81 80

42. #define VectorNumber_VReserved79 79

43. #define VectorNumber_VReserved78 78

44. #define VectorNumber_VReserved77 77

45. #define VectorNumber_VReserved76 76

46. #define VectorNumber_VReserved75 75

47. #define VectorNumber_VReserved74 74

48. #define VectorNumber_VReserved73 73

49. #define VectorNumber_VReserved72 72

50. #define VectorNumber_VReserved71 71

51. #define VectorNumber_VReserved70 70

52. #define VectorNumber_Vpit3 69

53. #define VectorNumber_Vpit2 68

54. #define VectorNumber_Vpit1 67

55. #define VectorNumber_Vpit0 66

56. #define VectorNumber_Vhti 65

57. #define VectorNumber_Vapi 64

58. #define VectorNumber_Vlvi 63

59. #define VectorNumber_VReserved62 62

60. #define VectorNumber_VReserved61 61

61. #define VectorNumber_VReserved60 60

62. #define VectorNumber_VReserved59 59

63. #define VectorNumber_VReserved58 58

64. #define VectorNumber_Vpwmesdn 57

65. #define VectorNumber_Vportp 56

66. #define VectorNumber_VReserved55 55

67. #define VectorNumber_VReserved54 54

69. #define VectorNumber_VReserved52 52

70. #define VectorNumber_VReserved51 51

71. #define VectorNumber_VReserved50 50

72. #define VectorNumber_VReserved49 49

73. #define VectorNumber_VReserved48 48

74. #define VectorNumber_VReserved47 47

75. #define VectorNumber_VReserved46 46

76. #define VectorNumber_VReserved45 45

77. #define VectorNumber_VReserved44 44

78. #define VectorNumber_VReserved43 43

79. #define VectorNumber_VReserved42 42

80. #define VectorNumber_VReserved41 41

81. #define VectorNumber_VReserved40 40

82. #define VectorNumber_Vcan0tx 39

83. #define VectorNumber_Vcan0rx 38

84. #define VectorNumber_Vcan0err 37

85. #define VectorNumber_Vcan0wkup 36

86. #define VectorNumber_Vflash 35

87. #define VectorNumber_Vflashfd 34

88. #define VectorNumber_VReserved33 33

89. #define VectorNumber_VReserved32 32

90. #define VectorNumber_VReserved31 31

91. #define VectorNumber_VReserved30 30

92. #define VectorNumber_Vcrgscm 29

93. #define VectorNumber_Vcrgplllck 28

94. #define VectorNumber_VReserved27 27

95. #define VectorNumber_VReserved26 26

96. #define VectorNumber_Vporth 25

97. #define VectorNumber_Vportj 24

98. #define VectorNumber_VReserved23 23

99. #define VectorNumber_Vatd0 22 100. #define VectorNumber_Vsci1 21 101. #define VectorNumber_Vsci0 20 102. #define VectorNumber_Vspi0 19

103. #define VectorNumber_Vtimpaie 18

104. #define VectorNumber_Vtimpaaovf 17

105. #define VectorNumber_Vtimovf 16

106. #define VectorNumber_Vtimch7 15

107. #define VectorNumber_Vtimch6 14

108. #define VectorNumber_Vtimch5 13

109. #define VectorNumber_Vtimch4 12

110. #define VectorNumber_Vtimch3 11

111. #define VectorNumber_Vtimch2 10

112. #define VectorNumber_Vtimch1 9

113. #define VectorNumber_Vtimch0 8

114. #define VectorNumber_Vrti 7

115. #define VectorNumber_Virq 6

116. #define VectorNumber_Vxirq 5

117. #define VectorNumber_Vswi 4

118. #define VectorNumber_Vtrap 3

119. #define VectorNumber_Vcop 2

120. #define VectorNumber_Vclkmon 1

121. #define VectorNumber_Vreset 0

122.

123. /**************** interrupt vector table ****************/ 124. #define Vsi 0x0000FF10

125. #define Vsyscall 0x0000FF12

126. #define VReserved118 0x0000FF14 127. #define VReserved117 0x0000FF16 128. #define VReserved116 0x0000FF18 129. #define VReserved115 0x0000FF1A 130. #define VReserved114 0x0000FF1C 131. #define VReserved113 0x0000FF1E 132. #define VReserved112 0x0000FF20 133. #define VReserved111 0x0000FF22 134. #define VReserved110 0x0000FF24 135. #define VReserved109 0x0000FF26 136. #define VReserved108 0x0000FF28 137. #define VReserved107 0x0000FF2A

139. #define VReserved105 0x0000FF2E 140. #define VReserved104 0x0000FF30 141. #define VReserved103 0x0000FF32 142. #define VReserved102 0x0000FF34 143. #define VReserved101 0x0000FF36 144. #define VReserved100 0x0000FF38 145. #define VReserved99 0x0000FF3A 146. #define VReserved98 0x0000FF3C 147. #define Vatd0compare 0x0000FF3E 148. #define VReserved96 0x0000FF40 149. #define VReserved95 0x0000FF42 150. #define VReserved94 0x0000FF44 151. #define VReserved93 0x0000FF46 152. #define VReserved92 0x0000FF48 153. #define VReserved91 0x0000FF4A 154. #define VReserved90 0x0000FF4C 155. #define VReserved89 0x0000FF4E 156. #define VReserved88 0x0000FF50 157. #define VReserved87 0x0000FF52 158. #define VReserved86 0x0000FF54 159. #define VReserved85 0x0000FF56 160. #define VReserved84 0x0000FF58 161. #define VReserved83 0x0000FF5A 162. #define VReserved82 0x0000FF5C 163. #define VReserved81 0x0000FF5E 164. #define VReserved79 0x0000FF60 165. #define VReserved78 0x0000FF62 166. #define VReserved77 0x0000FF64 167. #define VReserved76 0x0000FF66 168. #define VReserved75 0x0000FF68 169. #define VReserved74 0x0000FF6A 170. #define VReserved73 0x0000FF6C 171. #define VReserved72 0x0000FF6E 172. #define VReserved71 0x0000FF70

174. #define Vpit3 0x0000FF74 175. #define Vpit2 0x0000FF76 176. #define Vpit1 0x0000FF78 177. #define Vpit0 0x0000FF7A 178. #define Vhti 0x0000FF7C 179. #define Vapi 0x0000FF7E 180. #define Vlvi 0x0000FF80 181. #define VReserved62 0x0000FF82 182. #define VReserved61 0x0000FF84 183. #define VReserved60 0x0000FF86 184. #define VReserved59 0x0000FF88 185. #define VReserved58 0x0000FF8A 186. #define Vpwmesdn 0x0000FF8C 187. #define Vportp 0x0000FF8E 188. #define VReserved55 0x0000FF90 189. #define VReserved54 0x0000FF92 190. #define VReserved53 0x0000FF94 191. #define VReserved52 0x0000FF96 192. #define VReserved51 0x0000FF98 193. #define VReserved50 0x0000FF9A 194. #define VReserved49 0x0000FF9C 195. #define VReserved48 0x0000FF9E 196. #define VReserved47 0x0000FFA0 197. #define VReserved46 0x0000FFA2 198. #define VReserved45 0x0000FFA4 199. #define VReserved44 0x0000FFA6 200. #define VReserved43 0x0000FFA8 201. #define VReserved42 0x0000FFAA 202. #define VReserved41 0x0000FFAC 203. #define VReserved40 0x0000FFAE 204. #define Vcan0tx 0x0000FFB0 205. #define Vcan0rx 0x0000FFB2 206. #define Vcan0err 0x0000FFB4 207. #define Vcan0wkup 0x0000FFB6

209. #define Vflashfd 0x0000FFBA 210. #define VReserved33 0x0000FFBC 211. #define VReserved32 0x0000FFBE 212. #define VReserved31 0x0000FFC0 213. #define VReserved30 0x0000FFC2 214. #define Vcrgscm 0x0000FFC4 215. #define Vcrgplllck 0x0000FFC6 216. #define VReserved27 0x0000FFC8 217. #define VReserved26 0x0000FFCA 218. #define Vporth 0x0000FFCC 219. #define Vportj 0x0000FFCE 220. #define VReserved23 0x0000FFD0 221. #define Vatd0 0x0000FFD2 222. #define Vsci1 0x0000FFD4 223. #define Vsci0 0x0000FFD6 224. #define Vspi0 0x0000FFD8 225. #define Vtimpaie 0x0000FFDA 226. #define Vtimpaaovf 0x0000FFDC 227. #define Vtimovf 0x0000FFDE 228. #define Vtimch7 0x0000FFE0 229. #define Vtimch6 0x0000FFE2 230. #define Vtimch5 0x0000FFE4 231. #define Vtimch4 0x0000FFE6 232. #define Vtimch3 0x0000FFE8 233. #define Vtimch2 0x0000FFEA 234. #define Vtimch1 0x0000FFEC 235. #define Vtimch0 0x0000FFEE 236. #define Vrti 0x0000FFF0 237. #define Virq 0x0000FFF2 238. #define Vxirq 0x0000FFF4 239. #define Vswi 0x0000FFF6 240. #define Vtrap 0x0000FFF8 241. #define Vcop 0x0000FFFA 242. #define Vclkmon 0x0000FFFC

智能车舵机PD运算

/**********************舵机增量式PID算法*********************** double ref = 0;//设置参数设定值 double feb = 0;//采样反馈过程值 int pwm_var = 0; //PID调整量 int PWM_out = 0; //PWM输出量 double Uo = 0; double Ek = 0; double Ei = 0; double Ed = 0; #define Kp 8 //PID调节的比例常数 #define Ti 0.05 //PID调节的积分常数 #define Td 0.02 //PID调节的微分时间常数 #define T 0.02 //采样周期 #define Kpp Kp * ( 1 + (T / Ti) + (Td / T) ) #define Ki (-Kp) * ( 1 + (2 * Td / T ) ) #define Kd Kp * Td / T //#define Kpp 4 //#define Ki 0.8 //#define Kd 20 //误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡 #define Emin 3 //调整值限幅,防止积分饱和 #define Umax 100 #define Umin -100 //输出值限幅 #define Pmax 15500 #define Pmin 200 /////////////////////////////////////////////////////////////////// ////// PID运算 ///////

舵机控制原理详细资料

目录 一.舵机PWM信号介绍 (1) 1.PWM信号的定义 (1) 2.PWM信号控制精度制定 (2) 二.单舵机拖动及调速算法 (3) 1.舵机为随动机构 (3) (1)HG14-M舵机的位置控制方法 (3) (2)HG14-M舵机的运动协议 (4) 2.目标规划系统的特征 (5) (1)舵机的追随特性 (5) (2)舵机ω值测定 (6) (3)舵机ω值计算 (6) (4)采用双摆试验验证 (6) 3.DA V的定义 (7) 4.DIV的定义 (7) 5.单舵机调速算法 (8) (1)舵机转动时的极限下降沿PWM脉宽 (8) 三.8舵机联动单周期PWM指令算法 (10) 1.控制要求 (10) 2.注意事项 (10) 3.8路PWM信号发生算法解析 (11) 4.N排序子程序RAM的制定 (12) 5.N差子程序解析 (13) 6.关于扫尾问题 (14) (1)提出扫尾的概念 (14) (2)扫尾值的计算 (14)

一.舵机PWM 信号介绍 1.PWM 信号的定义 PWM 信号为脉宽调制信号,其特点在于他的上升沿与下降沿之间的时间宽度。具体的时间宽窄协议参考下列讲述。我们目前使用的舵机主要依赖于模型行业的标准协议,随着机器人行业的渐渐独立,有些厂商已经推出全新的舵机协议,这些舵机只能应用于机器人行业,已经不能够应用于传统的模型上面了。 目前,北京汉库的HG14-M 舵机可能是这个过渡时期的产物,它采用传统的PWM 协议,优缺点一目了然。优点是已经产业化,成本低,旋转角度大(目前所生产的都可达到185度);缺点是控制比较复杂,毕竟采用PWM 格式。 但是它是一款数字型的舵机,其对PWM 信号的要求较低: (1) 不用随时接收指令,减少CPU 的疲劳程度; (2) 可以位置自锁、位置跟踪,这方面超越了普通的步进电机; 其PWM 格式注意的几个要点: (1 ) 上升沿最少为0.5mS ,为0.5mS---2.5mS 之间; (2) HG14-M 数字舵机下降沿时间没要求,目前采用0.5Ms 就行;也就是说PWM 波形可以是一个周 期1mS 的标准方波; (3) HG0680为塑料齿轮模拟舵机,其要求连续供给PWM 信号;它也可以输入一个周期为1mS 的标 准方波,这时表现出来的跟随性能很好、很紧密。 图1-1

飞思卡尔硬件和部分软件部分笔记

常见稳压芯片和电路图 Modified by Taiyou 2011-1-27 硬件部分 一、总体模块框图 1、基本模块包括电源模块、测速模块、驱动模块、道路识别模块等,再加上调试模块部分,调试模块部分可单独设计,调试完后拆下,框图如下: 2、此外,还可以包括车速,车架速度、电池电压和舵机位置检测等电路,增加模型车运行参数检测,提高模型车控制性能,增加调试电路方便现场调试。下面的第二图为硬件模块与上面层的关系。 二、具体电路图 1、电源模块 主要包括以下几个部分的电源:

1)5V电压。主要为单片机、信号调理电路以及部分接口电路提供电源,电压要求稳定、 噪声小,电流容量大于500mA。 补充,一般在输出端并联一个大电容来解决稳定性问题 2)6V电压。主要是为舵机提供工作电压,实际工作时,舵机所需要的工作电流一般在几 十毫安左右,电压无需十分稳定。 3)7.2V电压。这部分直接取自电池两端电压,主要为后轮电机驱动模块提供电源。 4)12V电压。如果采用CCD/CMOS图像传感器来进行道路检测,则需要12V工作电压。 5)2V电压。为红外发光管提供工作电压,可以采用开关电源从电池降压而得,这样可以 提高红外检测电路的电源利用效率。需要根据红外发射管的参数确定该电压值。 补充,此电路为光电组所需电压,我们不需要。 除此之外,如果使用了其的芯片和传感器,它们的工作电压可能不在上述之内,还需要通过专门的稳压电路提供相应的工作电压。例如采用飞思卡尔公司的MC7260加速度传感器进行车轮打滑检测,该传感器需要3.3V的工作电压。 补充,由于今年增加了坡度的控制,我们队考虑了增加坡度检测方面的传感器。 降压稳压电路可以采用可以采用串联稳压可开关稳压两种芯片。开关稳压芯片的工作效率高,但有较高的电源噪声,耗电量比较大的电路适于采用开关稳压电路。例如采用大电流红外检测电路,由于红外发射管数量较多,总的消耗电流很大,采用开关电源将电池电压将至2V左右,作为红外发射管的工作电压,此时每个红外发射管工作时只需串联很小的限流电阻甚至不用串联电阻,采用这种方法,可大大提高电源利用效率。 稳压电路的设计需要简单可靠,在满足电压波动范围的要求下应尽量简化电路设计,例如舵机电源在4.5V~6V的范围内,电流100mA左右,可以从7.2V的电池电压通过串联两只硅二极管获得。此外,通过实验可发现,组委会所提供的舵机可以直接工作在7.2V的电压下,此时舵机的响应速度也会提高,所以可以直接使用电池电压作为舵机的电源。 如果采用CCD或CMOS摄像头作为道路传感器,它们工作电压在9~12V范围内,此工作电压高于电池的电压,需要借助于斩波升压电路获取,可以采用专门升压芯片进行设计,也可以利用单片机PWM输出端口控制大功率晶体管进行斩波升压。有些CMOS摄像头工作电压在6~9V之间,所以也可以直接使用电池电压提供电源,所以选择CMOS摄像头可以简化电源电路的设计。 消除电源中的噪声并减少电压波动,需要在各级电源模块中安装滤波电容,包括容量小的高频滤波电容以及大容量的电解电容。由于存在电机驱动,为了避免电机在启动和制动过程产生的冲击电流对电源的影响,应尽量加大电池两端的电容容量,但不要超过大赛规则允许的电容容量限制。 另一本书上的版本(2.5V、5V、6.5V、7.2V、12V): 1)采用稳压芯片LM2576将电源电压稳压到5V后,给单片机系统电路、车速检测

飞思卡尔智能车经验

RT,留下一点不算成功的经验吧。 先说说个人认为要取得好成绩的两个最重要的先决条件。 1. 人,这个是大前提,对于一个好的队伍,判别标准其实很简单,就是队员3个人是玩伴关系还是领导和下属关系。前者,大家都是来玩这个智能车的,自然主观能动性就会很高,能自主学习。不会总是“等着所谓队长分配任务”。这样效率就会很高。成绩自然不会低,后者,如果“队长”个人能力很强的话,就会出现到最后只有“队长”一个人在干。其他的队员就会因为自己技术不行,渐渐退出。而不会因为自己不会而去主动的学习。如果“队长”能力一般,再没有一些强力指导老师的情况下,这样的队伍一般会悲剧掉。所以,新人在参加这个智能车比赛的时就要明确动机。参加智能车确实是来学习知识的,但不会有人真正的来教你。一切都靠自己。 2.跑道,这个是客观条件中最重要的,一条污浊、破损、不符合规则的跑道,是不可能出成绩的。我们学校的赛道就是因为当初制作和后期保养不到位,导致赛道诸多永久性污浊、破损。一开始车刚能爬的时候,问题还不明显,后来在测试让车能平滑过S弯时问题就来了,由于赛道污浊,远处的跑道在CCD看了是错误,导致S弯和普通弯看起来一样,致使S弯策略根本没有启用,当时一直到修改S弯策略,到后来调出图像来看才发现是采集的问题。至于赛道污浊破损带来的干扰要不要处理,答案是肯定的,因为就算是比赛用的跑道也会有擦不掉,补不了的地方。但处理这些问题,应该是放在车辆原先行驶策略都调试正确的情况下,再人为的加入这些干扰。这样修改程序起来就有的放矢。 下面再以个人的观点介绍一下3个组别的特点,给新人选择做一个参考。 摄像头:有点像开卷考试,能得到的东西很多,但是如何把这些东西用好就是一个学问。摄像头的关键就是如何从采集回来的图像所包含的诸多信息中,选出一些高效方便的信息来控制车辆。至于控制策略,个人觉得一个能根据不同赛道类型而变化比例系数的比例控制器就能很好的满足控制需要。 光电组:想象起来很容易,其实很累的一个组,原理最简单,但是为了能有30CM以上的前瞻,和比较连续的偏差变化,就要下大功夫,先不说别的,让你装15个激光管,而且要保证不焊烧并要把光点打在一条线上,就是很繁琐的事情。总得来说,光电组拼的就是电路和传感器结构。不过对于看客来说,光电组是最好“看”的组,一排壮观的激光加上摆头的机械~ 电磁组:听起来有点复杂,其实比前两个组都轻松的组,电磁组又可分为数字和模拟两个类别。数字传感器就是和光电一样弄一排的传感器,看看哪个传感器接收到的信号最强以判断中线位置。模拟的就是比较两个传感器之间信号强度的差值来判断。电磁组好处就是不容易受到干扰,比赛上也见的,电磁车跑完的成功率是很高的,而且很容易判别起跑线。基本不用懂脑筋。而且如果选用是模拟传感器的话,能得到比较平滑的控制。 先说这些,想到再继续 关于摇头激光车的一点个人理解:为什么光电的车,要多花一个舵机去让传感器摇头呢?因为。为了能获得赛道上一个比较宽范围的信息,就必须把传感器做的很长。这样的后果 就是重量。折中的办法就是摇头,通过摇头,可以使一个小尺寸的传感器检测到大范围 DEMOK工作室淘宝小店

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤w

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤 /*****************************************************************************/ *本人用此法成功解救了4块板子【窃喜!】,此说明是本人边操作边截图拼成的,有些是在别的说明上直接截图【有些图本人不会截取,就利用现成的了,不过那也是本人用豆和财富值换来的】,表达不清之处还望见谅,大家将就着看吧!如能有些许帮助,我心甚慰!!! ————武狂狼2014.4.23 /*****************************************************************************/ 编译软件:CW5.1版本,下载器:飞翔BDMV4.6 【1】,连接好单片机,准备下载程序,单击下载按钮出现以下界面 或 (图1.1) 图 1.1——4中所有弹出窗口均单击“取消”或红色“关闭”按钮依次进入下一界面

(图1.2) (图1.3)

(图1.4) ******************************************************************************* ******************************************************************************* 【2】单击出现如下图所示下拉列表,然后单击 (图2.1) 出现下图(图2.2)对话框,按下面说明操作 (图2.2)

飞思卡尔 智能车舵机控制

智能车的制作中,看经验来说,舵机的控制是个关键.相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多. PID算法是个经典的算法,一定要将舵机的PID调好,这样来说即使不进行驱动电机的调速(匀速),也能跑出一个很好的成绩. 机械方面: 从我们的测试上来看,舵机的力矩比较大,完全足以驱动前轮的转向.因此舵机的相应速度就成了关键.怎么增加舵机的响应速度呢?更改舵机的电路?不行,组委会不允许.一个非常有效的办法是更改舵机连接件的长度.我们来看看示意图: 从上图我们能看到,当舵机转动时,左右轮子就发生偏转.很明显,连接件长度增加,就会使舵机转动更小的转角而达到同样的效果.舵机的特点是转动一定的角度需要一定的时间.不如说(只是比喻,没有数据),舵机转动10度需要2ms,那么要使轮子转动同样的角度,增长连接件后就只需要转动5度,那么时间是1ms,就能反应更快了.据经验,这个舵机的连接件还有必要修改.大约增长0.5倍~2倍. 在今年中,有人使用了两个舵机分别控制两个轮子.想法很好.但今年不允许使用了.

接下来就是软件上面的问题了. 这里的软件问题不单单是软件上的问题,因为我们要牵涉到传感器的布局问题.其实,没有人说自己的传感器布局是最好的,但是肯定有最适合你的算法的.比如说,常规的传感器布局是如下图: 这里好像说到了传感器,我们只是略微的一提.上图只是个示意图,意思就是在中心的地方传感器比较的密集,在两边的地方传感器比较的稀疏.这样做是有好处的,大家看车辆在行驶到转弯处的情况: 相信看到这里,大家应该是一目了然了,在转弯的时候,车是偏离跑道的,所以两边比较稀疏还是比较科学的,关于这个,我们将在传感器中在仔细讨论。 在说到接下来的舵机的控制问题,方法比较的多,有人是根据传感器的状态,运用查表法差出舵机应该的转角,这个做法简单,而且具有较好的滤波"效果",能够将错误的传感器状态滤掉;还有人根据计算出来的传感器的中心点(比

飞思卡尔智能车竞赛光电组技术报告

第九届“飞思卡尔”杯全国大学生智能车竞赛光电组技术报告 学校:中北大学 伍名称:ARES 赛队员:贺彦兴 王志强 雷鸿 队教师:闫晓燕甄国涌

关于技术报告和研究论文使用授权的说明书本人完全了解第八届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。 参赛队员签名: 带队教师签名: 日期:2014-09-15日

摘要 本文介绍了第九届“飞思卡尔杯全国大学生智能车大赛光电组中北大学参赛队伍整个系统核心采用飞思卡尔单片机MC9S12XS128MAA ,利用TSL1401线性CCD 对赛道的行扫描采集信息来引导智能小车的前进方向。机械系统设计包括前轮定位、方向转角调整,重心设计器件布局设计等。硬件系统设计包括线性CCD传感器安装调整,电机驱动电路,电源管理等模块的设计。软件上以经典的PID算法为主,辅以小规Bang-Bang 算法来控制智能车的转向和速度。在智能车系统设计开发过程中使用Altium Designer设计制作pcb电路板,CodeWarriorIDE作为软件开发平台,Nokia5110屏用来显示各实时参数信息并利用蓝牙通信模块和串口模块辅 助调试。关键字:智能车摄像头控制器算法。

目录 1绪论 (1) 1.1 竞赛背景 (1) 1.2国内外智能车辆发展状况 (1) 1.3 智能车大赛简介 (2) 1.4 第九届比赛规则简介 (2) 2智能车系统设计总述 (2) 2.1机械系统概述 (3) 2.2硬件系统概述 (5) 2.3软件系统概述 (6) 3智能车机械系统设计 (7) 3.1智能车的整体结构 (7) 3.2前轮定位 (7) 3.3智能车后轮减速齿轮机构调整 (8) 3.4传感器的安装 (8) 4智能车硬件系统设计 (8) 4.1XS128芯片介绍 (8) 4.2传感器板设计 (8) 4.2.1电磁传感器方案选择 (8) 4.2.2电源管理模 (9) 4.2.3电机驱动模块 (10) 4.2.4编码器 (11) 5智能车软件系统设 (11) 5.1程序概述 (11) 5.2采集传感器信息及处理 (11) 5.3计算赛道信息 (13) 5.4转向控制策略 (17) 5.5速度控制策略 (19) 6总结 (19)

飞思卡尔单片机寄存器及汇编指令详解

附录I:寄存器地址列表 直接页面寄存器总结

高页面寄存器总结

非易失寄存器总结 注:直接页面寄存器表地址的低字节用粗体显示,直接寻址对其访问时,仅写地址低字节即可。第2列中寄存器名用粗体显示以区别右边的位名。有0的单元格表示未用到的位总是读为0,有破折号的单元格表示未用或者保留,对其读不定。

附录II 指令接与寻址方式 HCS08指令集概括 运算符 () = 括号种表示寄存器或存储器位置的内容 ← = 用……加载(读: “得到”) & = 布尔与 | = 布尔或 ⊕= 布尔异或 ×= 乘 ÷ = 除 : = 串联 + = 加 - = 求反(二进制补码) CPU registers A =>累加器 CCR =>条件代码寄存器 H =>索引寄存器,高8位 X => 索引寄存器,低8位 PC =>程序计数器 PCH =>程序计数器,高8位 PCL =>程序计数器,低8位 SP =>堆栈指针 存储器和寻址 M =>一个存储区位置或者绝对值数据,视寻址模式而定 M:M + 0x0001 => 两个连续存储位置的16位值.高8位位于M的地址,低8位位于更高的连续地址. 条件代码寄存器(CCR)位 V => 二进制补码溢出指示,第7位 H => 半进位,第4位 I => 中断屏蔽,第 3位 N => 求反指示器, 第2位 Z => 置零指示器, 第1位 C => 进/借, 第0位 (进位第 7位 ) CCR工作性符号 – => 位不受影响 0 = > 位强制为0 1 = > 位强制为1

= >根据运算结果设置或清除位 U = > 运算后没有定义 机器编码符号 dd =>一个直接寻址0x0000–0x00FF的低8位(高字节假设为0x00) ee => 16位偏移量的高8位 ff => 16位偏移量的低8位 ii => 立即数的一个字节 jj => 16位立即数值的高位字节 kk => 16位立即数值的低位字节 hh => 16位扩展寻址的高位字节 ll => 16位扩展寻址的低位字节 rr => 相对偏移量 n —任何表达范围在0–7之间的一个有符号数的标号或表达式 opr8i —任何一个表达8位立即值的标号或表达式 opr16 —任何一个表达16位立即值的标号或表达式 opr8a —任何一个表达一个8位值的标号或表达式.指令对待这个8位值为直接页面64K 字节地址空间(0x00xx)中地址的低8位. opr16a —任何一个表达16位值的标号或表达式.指令对待这个值为直接页面64K字节地址空间. oprx8 —任何一个表达8位无符号值的标号或表达式,用于索引寻址. oprx16 —任何一个16位值的标号或表达式.因为HCS08有一个16位地址总线,这可以为一个有符号或者无符号值. rel —任何指引在当前指令目标代码最后一个字节之后–128 to +127个字节之内的标号或表达式.汇编器会计算包括当前指令目标代码在内的8位有符号偏移量. 寻址方式 隐含寻址(Inherent)如CLRA,只有操作码,无操作数,需要操作的数据一般为CPU寄存器,因此不需要再去找操作数了。(INH) 立即寻址 (Immediate)如LDA #$0A,“$”表示16进制,此时操作数位于FLASH空间,与程序一起存放。(IMM) 直接寻址 (Direct)如 LDA $88,只能访问$0000-$00FF的存储器空间,指令短速度快; (DIR) 扩展寻址 (Extended)如果操作数地址超出了$00FF,自动为扩展寻址;(EXT) 相对寻址(Relative)如BRA LOOP,指令中一般给出8位有符号数表示的偏移量。(REL) 变址寻址 (Indexed) 采用[H:X]或SP作为指针的间接寻址方式。( IX )( IX1 )( IX2 ) 变址寻址 (Indexed) 1〉无偏移量:CLR ,X 简写(IX) 2〉无偏移量,指令完成后指针加1(H:X = H:X + 0x0001) ,简写(IX+)只用于指令MOV和CBEQ指令中;

飞思卡尔智能车黑线识别算法及控制策略研究

智能车黑线识别算法及控制策略研究 时间:2009-05-1811:23:07来源:电子技术作者:北京信息科技大学,机电工程学院张淑 谦王国权 0引言 “飞思卡尔”杯全国大学生智能车大赛是由摩托罗拉旗下飞思卡尔公司赞助由高等学校自动化专业教学指导委员会负责主办的全国性的赛事,旨在加强大学生的创新意识、团队合作精神和培养学生的创新能力。此项赛事专业知识涉及控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,对学生的知识融合和动手能力的培养,对高等学校控制及汽车电子学科学术水平的提高,具有良好的推动作用。 智能车竞赛所使用的车模是一款带有差速器的后轮驱动模型赛车,它由大赛组委会统一提供。自动控制器是以飞思卡尔16位微控制器MC9S12DGl28(S12)为核心控制单元,配合有传感器、电机、舵机、电池以及相应的驱动电路,它能够自主识别路径,控制车高速稳定运行在跑道上。比赛要求自己设计控制系统及自行确定控制策略,在规定的赛道上以比赛完成的时间短者为优胜者。赛道由白色底板和黑色的指引线组成。根据赛道的特点,比赛组委会确定了两种寻线方案:1.光电传感器。2.摄像头。 两种寻线方案的特点如下: (1)光电传感器方案。通过红外发射管发射红外线光照射跑道,跑道表面与中心指引线具有不同的反射强度,利用红外接收管可以检测到这些信息。此方案简单易行程序调试也简单且成本低廉,但是它受到竞赛规则的一些限制(组委会要求传感器数量不超过16个(红外传感器的每对发射与接收单元计为一个传感器,CCD传感器计为1个传感器)),传感器的数量不可能安放的太多,因而道路检测的精度较低,能得到指引线的信息量也较少。若采用此方案容易引起舵机的回摆走蛇形路线。 (2)摄像头方案。根据赛道的特点斯用黑白图像传感器即可满足要求。CCD摄像头有面阵和线阵两种类型,它们在接口电路、输出信号以及检测信息等方面有着较大的区别,面阵摄像头可以获取前方赛道的图像信息,而线阵CCD只能获取赛道一条直线上的图像信息。摄像头方案的所能探测的道路信息量远大于光电传感器方案,而且摄像头也可以探测足够远的距离以方便控制器对前方道路进行预判。虽然此方案对控制器的要求比较高,但组委会提供的MC9S12DGl28(S12)的运算能力以及自身AD口的采样速度完全能够满足摄像头的视频采样和大量图像数据的处理的要求。 本文就是在摄像头方案的前提下,在实时的图像数据获取的基础上对图像信息进行数据处理,从而提取赛道中心的黑色指引线,再以此来作为舵机和驱动电机的控制依据。 1摄像头采样数据的特点 采用的黑白摄像头的主要工作原理为:按一定的分辨率,以隔行扫描的方式采集图像上的点,当扫描到某点时,就通过图像传感芯片将该点处图像的灰度转换成与灰度一一对应的电压值,然后将此电压值通过视频信号端输出,见图1。摄像头连续地扫描图像上的一行,则输出就是一段连续的电压信号,该电压信号的高低起伏反映了该行图像的灰度变化。当扫描完一行,视频信号端就输出一个低于最低视频信号电压的电平(如O.3V),并保持一段时间。这样相当于紧接着每行图像信号之后会有一个电压“凹槽”,此“凹槽”叫做行同步脉

飞思卡尔MC9S12XS128单片机中断优先级设置简易教程

本教程试图用最少的时间教你飞思卡尔XS128单片机的中断优先级设置方法和中断嵌套的使用,如果是新手请先学习中断的基本使用方法。 先来看看XS128 DataSheet 中介绍的相关知识,只翻译有用的: 七个中断优先级 每一个中断源都有一个可以设置的级别 高优先级中断的可以嵌套低优先级中断 复位后可屏蔽中断默认优先级为1 同一优先级的中断同时触发时,高地址(中断号较小)的中断先响应 注意:高地址中断只能优先响应,但不能嵌套同一优先级低地址的中断 下面直接进入正题,看看怎么设置中断优先级: XS128中包括预留的中断一共有128个中断位,如果为每个中断都分配一个优先级寄存器的话会非常浪费资源,因此飞思卡尔公司想出了这样一种办法:把128个中断分为16个组,每组8个中断。每次设置中断时,先把需要的组别告诉某个寄存器,再设置8个中断优先寄存器的某一个,这样只需9个寄存器即可完成中断的设置。 分组的规则是这样的:中断地址位7到位4相同的中断为一组,比如MC9SX128.h中 这些中断的位7到位3都为D,他们就被分成了一组。0~F正好16个组。

INT_CFADDR就是上面说到的用来设置组别的寄存器: 我们需要设置某个组别的中断时,只要写入最后8位地址就行了,比如设置SCI0的中断优先级,就写入0xD0。 设置好组别之后,我们就要该组中相应的中断进行设置,设置中断的寄存器为 这其实是一组寄存器,一共有8个,每个都代表中断组中的一个中断。对应规则是这样的:中断地址的低四位除以2 比如还是SCI0,低四位是6,除以二就是3,那么我们就需要设置INT_CFDATA3 往INT_CFDATAx中写入0~7就能设置相应的中断优先级了 拿我本次比赛的程序来举个例子:我们的程序中需要3个中断:PIT0,PORTH,SCI0。PIT0定时检测传感器数值,PORTH连接干簧管进行起跑线检测,SCI0接收上位机指令实现急停等功能。因此中断优先级要SCI0>PORTH>PIT0。 我们先要从头文件中找出相应中断的地址: PIT0【7:4】位为7,选择中断组: INT_CFADDR=0x70;

舵机控制程序

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,

获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制信号是PWM信号,利用占

空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。 图1 舵机的控制要求 单片机实现舵机转角控制可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放 器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV 以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波

电路的精度难以达到舵机的控制精度要求。 也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。 单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。 具体的设计过程: 例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为 20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在

飞思卡尔单片机知识点

1、单片机组成:1> CPU 2> 存储器3>I/O ; 2、存储器包括2大类:ROM , RAM 3、标准ASCII码使用(1)个字节表示字符; 4、BCD码是用()进制表示的()的数据; 5、HCS08QG8的最小系统包括(电源电路,复位电路,下载口,(内部时钟)); 6、QG8管脚数量(16)、只能输入的是(PTA5)、只能输出的是(PTA4)、程序下载的是、接外部时钟的是; 7、QG8的管脚可以作为数字输入输出、也可以作为模拟输入,可以作为模拟输入的有(); 8、QG8管脚复用优先级最低的功能是(I/O); 9、QG8存储器配置中,不同资源的分界线……; 10、CPU寄存器有(A, HX, PC, CCR, SP); 11、可以执行位操作的地址范围(0X0000~0X005F); 12、有地址的寄存器分成了(3)块(0页,高页,非易失); 13、如何在C语言中定义常数(数据类型变量名;),如何指定变量的地址(数据类型变量名@ 地址;); 14、堆栈的管理者是寄存器(SP); 15、SP的复位缺省值是(0X00FF); 16、堆栈对数据的操作特点是(向上生长型:先压后涨、先减后弹); 17、堆栈一般在RAM的高地址区域还是低地址区域?高地址区 18、内部时钟源包括哪4大部分? 19、外部时钟分哪2大类;振荡器,整形外部时钟 20、内部时钟中FLL固定倍频(512倍频); 21、ICS的7种工作模式(FEI, FEE, FBI, FBILP, FBE, FBELP, stop); 22、ICS的内部参考时钟是可以校准、微调的,调整的寄存器名(ICSTRM);该寄存器的数值越大,输出时钟频率越(低); 23、FLASH是按页管理的,页大小(512)字节,每页分(8)行; 24、高页寄存器位于FLASH的最后一页的(第六行/0xFFB0~0xFFBF)位置; 25、FLASH的最后一页最后一行是(中断向量); 26、FLASH块保护寄存器(FPROT);块加密寄存器(FOPT);对应的非易失寄存器分别是(NVOPT, NVPROT); 27、FLASH操作的一般过程是(); 28、FLASH操作的有效命令有(空检查,字节编程,突发模式编程,页擦除,全部ROM 擦除); 29、记录程序运行状态的CPU寄存器是(CCR); 30、指令系统包括6大类指令,分别是(算术运算指令、数据传送指令、数据和位操作、逻辑运算、程序控制、堆栈处理); 31、寻址方式是指(CPU访问操作数和数据的方法); 32、寻址方式包括7大类16种,分别是: INH IMM DTR EXT IX,IX1,IX2,SP1,SP2,IX+,IX1+ REL IMD, DD,IX+D,DIX+ 33、8指令模板和6指令模板分别是(); 34、QG8是高电平复位还是低电平复位?低电平 35、QG8数据存储器RAM的大小为(512)字节; 36、上电复位期间将管脚(A4)设置为(低)电平可以进入调试模式 37、QG8的存储器结构为冯·诺伊曼还是哈佛结构?冯诺依曼

舵机算法

根据前面介绍的CMOS图像传感器采集处理得到的只是40行中每一行的黑线坐标。 并没有得出赛道的具体形状,到底是直道还是弯道,是大弯还是急弯,是偏向一个方向的弯道还是“S型”弯道,是“大S型”弯道还是“小S型”弯道。这就可以通过曲率的计算来得出。下面给出曲率的具体计算方法。 首先,将扫描到的40行中每9行分为一组,而且彼此交叉,也就是说,在能扫描到的情况下,划分为从第0行到第8行,从第1行到第9行,从第2行到第10行,依此类推,最后从21行到第29行,一共可以划分为22段,分别计算每一段的曲率,以第一段为例,计算的方法为:将第i行的坐标定义为coordinate[i],将CMOS图像传感器的中心坐标定义为middle,那么每一行相对于中心坐标的偏差就为 ek[i]=coordinate[i]-middle (4.1) 再乘以每一行各自的校正值emendation[i],计算公式为 ek[i]=ek[i]*emendation[i] (4.2) 就得到了各行实际偏离中心位置的距离。然后用第0行的偏差加上第8行的偏差之和除以2再减去第4行的偏差,得出一个相对偏差ek_comparatively。ek_comparatively的计算公式为 ek_comparatively=(ek[8]+ek[0])/2-ek[4] (4.3) 然后计算出该段曲线对应的直道,即将第0行的黑点与第8行的黑点直接相连的直线的长度计算出来,计算公式为 distance_beeline=sqrt((ek[8]-ek[0])*(ek[8]-ek[0])+48*48) (4.4) 最后将公式(4.3)除以公式(4.4),得到最后曲线的弯曲度为curve_degree。计算公式为 curve_degree=ek_comparatively/ distance_beeline (4.5) 就得出了曲线的弯曲程度,然后根据每一段的弯曲程度,最终得出所扫描到的全部道路的形状。 4.2.2 道路形状精确识别算法 利用4.1.3中对道路弯曲程度的计算,根据扫描到的道路每段的弯曲程度,可以对道路形状进行较为精确的识别,在进行具体的道路识别之前,先给出几个比较模糊的概念,这是描述弯道的弯曲程度的,弯曲程度非常小,比较小,比较大,非常大。这几个概念在下面对于赛道具体识别时有提及。 (1)直道的识别

飞思卡尔智能车技术报告

第六届“飞思卡尔”杯全国大学生智能汽车邀请赛技术报告 学校: 队伍名称: 参赛队员: 带队教师:

关于技术报告和研究论文使用授权的说明 本人完全了解第六届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。 参赛队员签名: 带队教师签名: 日期: 摘要 随着现代科技的飞速发展,人们对智能化的要求已越来越高,而智能化在汽车相关产业上的应用最典型的例子就是汽车电子行业,

汽车的电子化程度则被看作是衡量现代汽车水平的重要标志。同时,汽车生产商推出越来越智能的汽车,来满足各种各样的市场需求。本文以第六届全国大学生智能车竞赛为背景,主要介绍了智能车控制系统的机械及硬软件结构和开发流程。 机械硬件方面,采用组委会规定的标准 A 车模,以飞思卡尔半导体公司生产的80管脚16 位单片机MC9S12XS128MAA 为控制核心,其他功能模块进行辅助,包括:摄像头数据采集模块、电源管理模块、电机驱动模块、测速模块以及无线调试模块等,来完成智能车的硬件设计。 软件方面,我们在CodeWarrior IDE 开发环境中进行系统编程,使用增量式PD 算法控制舵机,使用位置式PID 算法控制电机,从而达到控制小车自主行驶的目的。 另外文章对滤波去噪算法,黑线提取算法,起止线识别等也进行了介绍。 关键字:智能车摄像头图像处理简单算法闭环控制无线调试 第一章引言 飞思卡尔公司作为全球最大的汽车电子半导体供应商,一直致力于为汽车电子系统提供全范围应用的单片机、模拟器件和传感器等器件产品和解决方案。飞思卡尔公司在汽车电子的半导体器件市场拥有领先的地位并不断赢得客户的

PID改进飞思卡尔智能车算法

PID改进飞思卡尔智能车算法 PID改进飞思卡尔智能车算法:智能车系统是一个时变且非线性的系统,采用传统PID算法的单一的反馈控制会使系统存在不同程度的超调和振荡现象,无法得到理想的控制效果。将前馈控制引入到了智能车系统的控制中,有效地改善了系统的实时性,提高了系统的反应速度;并且根据智能车系统的特点,对数字PID算法进行了改进,引入了微分先行和不完全微分环节,改善了系统的动态特性;同时,利用模糊控制具有对参数变化不敏感和鲁棒性强的特点,将模糊算法与PID算法相结合,有效地提高了智能车的适应性和鲁棒性,改善了系统的控制性能。 改进PID算法 智能车的控制是由飞思卡尔公司的S12芯片完成,所以对智能车的控制要采用计算机控制方法。本文针对智能车控制的特殊性,对传统数字PID算法做了一些改进,这样可以更好地满足智能车控制的需要。 不完全微分PID 将微分环节引入智能车的方向和速度控制,明显地改善了系统的动态性能,但对于误差干扰突变也特别敏感,对系统的稳定性有一定的不良影响。为了克服上述缺点,本文在PID算法中加入了一阶惯性环节,不完全微分PID算法结构如图1所示。 将一阶惯性环节直接加到微分环节上,可得到系统的传递函数为: 将(1)式的微分项推导并整理,得到方程如下: 式中,,由系统的时间常数和一阶惯性环节时间常数决定的一个常数。 为了编程方便,可以将2-2式写成如下形式:

分析式(3)可知,引入不完全微分以后,微分输出在第一个采样周期内被减少了,此后又按照一定比例衰减[3][4]。实验表明,不完全微分有效克服了智能车的偏差干扰给速度控制带来的不良影响,具有较好的控制效果。图2为不完全微分PID算法的程序流程图。 微分先行PID 由于智能车在跑道上行驶时,经常会遇到转弯的情况,所以智能车的速度设定值和方向设定值都会发生频繁的变化,从而造成系统的振荡。为了解决设定值的频繁变化给系统带来的不良影响,本文在智能车的速度和方向控制上引入了微分先行PID算法,其特点是只对输出量进行微分,即只对速度测量值和舵机偏转量进行微分,而不对速度和方向的设定值进行微分。这样,在设定值发生变化时,输出量并不会改变,而被控量的变化相对是比较缓和的,这就很好地避免了设定值的频繁变化给系统造成的振荡,明显地改善了系统的动态性能。 图3是微分先行PID控制的结构图,微分先行的增量控制算式如下。

飞思卡尔HC12系列单片机USBDM烧录操作指导

飞思卡尔HC12系列单片机USBDM烧录操作指导 步骤一 将USBDM烧录器连接到电脑的USB口,然后,双击桌面的“hiwave.exe”图标,出现图1的窗口。 图1 假如USBDM没有连接或者连接不良,会出现如下图2的窗口,关掉程序,检查连接,再启动程序,直到出现图1的窗口。

步骤二. 将USBDM连接到需要烧录的仪表上,点击图1的“OK”按钮,将窗口最大化,然后看显示器的右下角,见图3所示,有“ACKN SYNC STOPPED”,表示连接正常。假如出现图4的窗口,表示BDM没有和仪表连接上,检查下载线。点击Cancel按钮。直到出现图3的“ACKN SYNC STOPPED”状态。 图3 图4 步骤三 点击图5的菜单栏的“TBDML HCS12”,然后点击“Load”,出现目标文件选择的窗口。见图6

图6 选择烧录的目标文件,目标文件的后缀名为“.abs”, 这里举例 1:选择DM281HZ-V1.2.abs, 2:勾选Automatically erase and program into FLASH and EEPROM 3:不勾选V erify memory image after loading code,为了节省烧录时间,不勾选这个选项。 3: 勾选Run after successful load.(可以在程序烧完的时候,自动的运行程序,看仪表是否能工作,可以作为仪表的第一次粗测) 4:点击“打开” 5:等待烧录完成, 图7,正在擦除……

图8,正在编程…… 图8 6:如果在完成编程后,仪表没有自动的进入工作状态,有以下几种可能: a.仪表有问题 b.烧录时出现问题,这个问题可以通过配置烧录选项来排除,见图6, 可以勾选选项V erify memory image after loading code ,在编程后会进行程序校验,如果校验错误表示烧录出现问题,一般来说出现烧录错误的几率很小,但也不排除。为了在批量烧录的时候,节省时间,没有选择校验。 c.烧录文件选择错误 7:如果仪表正常,拔掉USBDM和仪表的下载线,直接换上新的仪表,重复步骤三。 给程序建立快捷方式,方便操作 由于hiwave.exe程序在桌面没有快捷方式,可以自己建立一个快捷方式。 1. 打开路径C:\Program Files\Freescale\CodeWarrior for S12(X) V5.0\Prog,找到“hiwave.exe”文件 (如果CodeWarrior不是安装在C盘,则请按照…Freescale\CodeWarrior for S12(X) V5.0\Prog 寻找。)2.在文件上点击右键选择“发送到”—选择“桌面快捷方式”,就可以在桌面看到一个“hiwave.exe”程 序文件的快捷图标。以后再启动程序的时候,只需点击桌面的这个图标即可。 图1

舵机控制

利用单片机PWM信号进行舵机控制(图) 基于单片机的舵机控制方法具有简单、精度高、成本低、体积小的特点,并可根据不同的舵机数量加以灵 活应用。 在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。 图1舵机的控制要求 舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。 单片机实现舵机转角控制 可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波电路的精度难以达到舵机的控制精度要求。 也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。 单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设

相关文档
最新文档