标题: 单片机电动自行车控制系统 [打印本页]

作者: 烟花尽头    时间: 2016-6-5 13:26
标题: 单片机电动自行车控制系统
单片机电动自行车控制系统

  1. 单片机控制的电动自行车驱动系统
  2. 14.4.4  各部分程序
  3. LIST P=16F876
  4. #INCLUDE P16F876.INC
  5. ;以下采用块定义的方法定义单片机内部寄存器
  6. CBLOCK 0X20 ;自
  7. 定义寄存器从0X20开始
  8. FLAG1 ;
  9. FLAG1作为标志寄存器
  10. VOLTAGEH ;电池电压高位寄
  11. 存器
  12. VOLTAGEL ;电池电压低位寄
  13. 存器
  14. TSH
  15. ;手柄电压高位寄存器
  16. TSL
  17. ;手柄电压低位寄存器
  18. STATE1 ;霍
  19. 尔信号采样暂存器1
  20. STATE2 ;霍
  21. 尔信号采样暂存器2
  22. STATE3 ;霍尔信号采样暂
  23. 存器3
  24. DELAY ;延
  25. 时计数器
  26. COUNT_VOL ;低电压采样次数
  27. 计数器
  28. ACCaLO   ;
  29. ACCa~ACCd为运算用的寄存器
  30. ACCaHI  
  31. ACCbLO  
  32. ACCbHI  
  33. ACCcLO  
  34. ACCcHI  
  35. ACCdLO  
  36. ACCdHI  
  37. TEMP  ;临
  38. 时寄存器
  39. TEMP1  ;临
  40. 时寄存器(中断用)
  41. SIGN  ;符
  42. 号寄存器
  43. COUNT  ;临
  44. 时寄存器
  45. W_STACK ;中
  46. 断时用于暂存W寄存器值
  47. ST_STACK ;中
  48. 断时用于暂存STATUS寄存器值
  49. ENDC
  50. ;***********标志寄存器位定义以及程序中常数定义***********
  51. CONSTANT VOLTAGE=0 ;采电池电压标志位
  52. CONSTANT PWM=1 ;输出下一次PWM信号标志位
  53. CONSTANT LOWPOWER=2 ;低电压标志位
  54. CONSTANT SHUTDOWN=3 ;刹车标志位
  55. CONSTANT OFF=4 ;复位标志位
  56. CONSTANT AND=0XE0 ;AND用于获取有效霍尔信号
  57. CONSTANT FULLPWM=0XFF ;当PWM输出全高时,输入CCPR1L中的值
  58. CONSTANT VOLOFFH=0X02 ;当电池电压低于24AH时, 低压保护2.86
  59. V/31.5 V
  60. CONSTANT VOLOFFL=0X4A
  61. CONSTANT VOLONH=0X02 ;当电池电压大于266H时,允许电机重开
  62. 3V/33V
  63. CONSTANT VOLONL=0X66
  64. CONSTANT TSONH=0X01 ;刹车后手柄复位值低于133H,则允许电
  65. 机重新启动
  66. CONSTANT TSONL=0X33
  67. ;***复位矢量入口(单片机复位时,PC指针指向程序存储器0X0000单元)***
  68. ORG 0X0000
  69. START GOTO MAIN ;复位后程序进入主程序
  70. ;***中断矢量入口程序(PIC单片机的中断矢量入口为0X0004)***
  71. ORG 0X0004 ;中
  72. 断矢量入口
  73. BTFSC INTCON,RBIF ;是否为RB口电平
  74. 变化中断?
  75. GOTO SAMPLERB ;是,进入RB口电平变化中断
  76. 服务程序
  77. BTFSC PIR1,ADIF ;是否为AD采样中断
  78. GOTO AD ;
  79. 是,进入AD中断服务程序
  80. BTFSC INTCON,INTF ;是否为刹车中断
  81. GOTO BRAKE ;是,刹车中断处

  82. RETFIE ;如
  83. 都不是,则中断返回
  84. ;************逆变桥输出控制表*************
  85. ;逆变桥输出控制表,其输出对应6种状态,霍尔信号来自B口RB7、RB6、RB5,C口输出低电
  86. 平有
  87. ;效,其中RC1,RC2不作为触发电路输出口,故表中使其为高电平
  88. ORG 0X0020 ;表程序从0X0020单元开始存
  89. 放(也可以不从这开始)
  90. OUT_TABLE
  91. ADDWF PCL,1
  92. RETLW 0X0AF ;如霍尔信号为
  93. 0、0、0,则使RC4、RC6为低电平
  94. RETLW 0X0BE ;如霍尔信号为
  95. 0、0、1,则使RC0、RC6为低电平
  96. RETLW 0X0FF ;没有为0、1、0
  97. 的霍尔信号对应电机状态
  98. RETLW 0X07E ;如霍尔信号为
  99. 0、1、1,则使RC0、RC7为低电平
  100. RETLW 0X0CF ;如霍尔信号为
  101. 1、0、0,则使RC4、RC5为低电平
  102. RETLW 0X0FF ;没有为1、0、1
  103. 的霍尔信号对应电机状态
  104. RETLW 0X0D7 ;如霍尔信号为
  105. 1、1、0则使RC3、RC5为低电平
  106. RETLW 0X077 ;如霍尔信号为
  107. 1、1、1则使RC3、RC7为低电平
  108. ;***************主程序*****************
  109. ORG 0X0100 ;主
  110. 程序从0X0100单元开始存储
  111. MAIN
  112. MOVLW 0X0FF ;由于C口上电复
  113. 位值不确定,必须先关闭所有MOS管
  114. MOVWF PORTC
  115. BSF STATUS,RP0 ;选
  116. 择存储体1
  117. MOVLW 0X02 ;设
  118. 置RC1为输入口,其它为输出口,其中RC2为PWM   
  119. MOVWF TRISC ;输出口,其它位
  120. 为触发信号输出
  121. BCF STATUS,RP0 ;选
  122. 择存储体0
  123. CLRF PIR1 ;清
  124. 所有中断标志位
  125. CLRF INTCON ;禁止所有中断
  126. MOVLW 0X01 ;设
  127. 置TMR2预分频值为4
  128. MOVWF T2CON
  129. MOVLW FULLPWM ;初始化PWM工作循环寄存
  130. 器,使PWM占空比为1
  131. MOVWF CCPR1L ;输出电压为零
  132. MOVLW 0XFF ;设
  133. 置CCP1工作于PWM方式
  134. MOVWF CCP1CON
  135. MOVLW 0X0B ;
  136. CCP2工作于特殊事件触发方式,用作AD采样周期寄存 MOVWF
  137. CCP2CON ;器
  138. MOVLW 0X081 ;选择AD转换时钟
  139. 为32分频,选择AN0通道,并使AD
  140. MOVWF ADCON0 ;转换允许
  141. CLRF TMR2 ;TMR2计数器清零
  142. CLRF TMR1H ;TMR1计数器清零
  143. CLRF TMR1L
  144. CLRF T1CON ;TMR1预分频为
  145. 1,关闭振荡器,工作于定时工作方式
  146. MOVLW 0X08 ;初
  147. 始化AD采样周期寄存器,T=512 μs
  148. MOVWF CCPR2H
  149. MOVLW 0X00
  150. MOVWF CCPR2L
  151. BSF STATUS,RP0 ;选
  152. 择存储体1
  153. MOVLW 0XEF ;RB
  154. 口高3位用于采样霍尔信号,RB0为刹车中断,设置为
  155. MOVWF TRISB ;输入,其它未用
  156. MOVLW 0XC7 ;初
  157. 始化PWM频率为5 kHz
  158. MOVWF PR2
  159. MOVLW 0X082 ;AD采样结果右
  160. 移,RA口引脚均为模拟输入
  161. MOVWF ADCON1
  162. BSF OPTION_REG,INTEDG  ;选择INT在下降沿产生中断
  163. BCF STATUS,RP0
  164. CALL SAMPLE ;确定当前转子位

  165. CALL OUTPUT ;根据采得的状态
  166. 值触发相应的MOSFET
  167. MOVLW 0X0D8 ;开总中断、外围
  168. 中断、INT中断和RB口电平变化中断允
  169. MOVWF INTCON ;许
  170. BCF PIE2,CCP2IE ;CCP2中断禁止
  171. BSF PIE1,ADIE ;打开AD采样中断
  172. CLRF FLAG1 ;清标志位寄存器
  173. CLRF COUNT_VOL ;清电池电压采样计数器
  174. BSF T1CON,TMR1ON ;开CCP2,对手柄
  175. 进行等间隔采样
  176. BSF T2CON,TMR2ON ;开CCP1
  177. RETEST BTFSS FLAG1,PWM ;TS采样完毕?
  178. GOTO NEXT1 ;没有,转NEXT1
  179. CALL OUT_PWM ;TS采样完毕,送出相应的
  180. PWM信号
  181. BCF FLAG1,PWM ;清PWM允许标志
  182. NEXT1 BTFSS FLAG1,LOWPOWER;电压采样完毕?
  183. GOTO NEXT2 ;没有转NEXT2
  184. CALL POWER ;是,调用电压保
  185. 护子程序处理数据
  186. BTFSC FLAG1,OFF ;是否需要复位?
  187. GOTO MAIN ;是,单片机复位
  188. NEXT2 BTFSS FLAG1,SHUTDOWN;刹车中断到来?
  189. GOTO RETEST ;否,回转RETEST
  190. CALL BRAKEON ;是,调用刹车处
  191. 理子程序
  192. CLRWDT
  193. BTFSC FLAG1,OFF ;OFF=0?
  194. GOTO MAIN ;否,单片机复位
  195. GOTO RETEST ;是,回转RETEST
  196. ;***************刹车处理子程序******************
  197. BRAKEON BCF FLAG1,OFF ;清复位标志
  198. BCF FLAG1,SHUTDOWN;是,清相应标志位
  199. BTFSS PORTB,0 ;INT引脚仍为1?
  200. RETURN ;
  201. 否,中断是由干扰引起的,返回
  202. BSF STATUS,RP0
  203. BCF PIE1,ADIE ;禁止AD采样中断
  204. BCF STATUS,RP0
  205. BCF INTCON,INTE ;关
  206. RB0中断
  207. MOVLW FULLPWM ;PWM输出全高
  208. MOVWF CCPR1L
  209. BCF T1CON,TMR1ON ;关闭手柄采样
  210. BREAK2 BTFSC ADCON0,GO ;正在进行AD采样?
  211. GOTO BREAK2 ;是,等待AD采样
  212. 完毕
  213. BCF ADCON0,CHS0
  214. BCF ADCON0,CHS1 ;选择0采样通
  215. 道,准备采样手柄电压
  216. BCF PIR1,ADIF ;清AD采样中断标
  217. 志位
  218. MOVLW 0X06 ;延

  219. MOVWF COUNT
  220. BREAK3 DECFSZ COUNT
  221. GOTO BREAK3
  222. BREAK5 BSF ADCON0,GO ;采样TS值
  223. BREAK4 BTFSS PIR1,ADIF ;采样完毕?
  224. GOTO BREAK4
  225. BCF PIR1,ADIF
  226. BCF STATUS,C
  227. MOVF ADRESH,0 ;当前TS值送被减数
  228. MOVWF ACCbHI
  229. BSF STATUS,RP0
  230. MOVF ADRESL,0
  231. BCF STATUS,RP0
  232. MOVWF ACCbLO
  233. MOVLW TSONH ;1.5 V所对应的
  234. 采样值送减数
  235. MOVWF ACCaHI
  236. MOVLW TSONL
  237. MOVWF ACCaLO
  238. CALL D_sub ;当前TS值减1.5V
  239. MOVLW FULLPWM
  240. MOVWF CCPR1L
  241. CLRWDT
  242. BTFSS ACCbHI,7 ;当前电压值大于1.5V?
  243. GOTO BREAK5 ;是,重新采样
  244. BTFSC PORTB,0
  245. GOTO BREAK5
  246. BSF FLAG1,OFF ;否,置相应的标
  247. 志位
  248. RETURN ;返

  249. ;***************开环PWM输出子程序****************
  250. OUT_PWM BCF FLAG1,PWM ;清相应的标志位
  251. MOVF TSH,0 ;将调速手柄采样
  252. 值送至被加数
  253. MOVWF ACCaHI
  254. MOVF TSL,0
  255. MOVWF ACCaLO
  256. MOVLW 0XFF ;
  257. FF1F补码为0XE1,即1.1 V
  258. MOVWF ACCbHI
  259. MOVLW 0X1F
  260. MOVWF ACCbLO
  261. CALL D_add
  262. BTFSS ACCbHI,7 ;TS>1.1V?
  263. GOTO PWM1 ;是,转PWM1
  264. MOVLW FULLPWM ;否则输出全高
  265. MOVWF CCPR1L
  266. RETURN
  267. PWM1 MOVLW 0XFD ;0X27B=3.1V
  268. MOVWF ACCbHI
  269. MOVLW 0X85
  270. MOVWF ACCbLO
  271. CALL D_add
  272. BTFSC ACCbHI,7 ;TS>3.1V?
  273. GOTO PWM3
  274. PWM2 CLRF CCPR1L
  275. BCF CCP1CON,4
  276. BCF CCP1CON,5
  277. RETURN
  278. PWM3 MOVLW 0X0FF ;1.1 V对应的采样值补码送
  279. 加数
  280. MOVWF ACCbHI
  281. MOVLW 0X1F
  282. MOVWF ACCbLO
  283. CALL D_add ;TS-1.1V
  284. CLRF ACCaHI ;系数K=56=38H送
  285. 乘数
  286. MOVLW 0X3F
  287. MOVWF ACCaLO
  288. CALL D_mpy ;得到放大128倍
  289. 的低电平时间K*(TS-1.1V)
  290. MOVF ACCcHI,0 ;将结果取出
  291. MOVWF ACCaHI
  292. MOVF ACCcLO,0
  293. MOVWF ACCaLO
  294. MOVLW 0X64 ;PWM
  295. 周期T减去低电平时间,得到高电平时间
  296. MOVWF ACCbHI
  297. CLRF ACCbLO
  298. CALL D_sub
  299. BTFSC ACCbHI,7 ;低电平时间是否大于周期?
  300. GOTO PWM2 ;是,输出全压
  301. RLF ACCbLO ;否
  302. 则,输出与低电平时间对应的高电平时间
  303. RLF ACCbHI
  304. MOVF ACCbHI,0 ;D10~D2位送CCPR1L
  305. MOVWF CCPR1L
  306. BCF CCP1CON,5 ;D0位送CCP1CON5
  307. BTFSC ACCbLO,7
  308. BSF CCP1CON,5
  309. BCF CCP1CON,4 ;D.1位送
  310. CCP1CON4
  311. BTFSC ACCbLO,6
  312. BSF CCP1CON,4
  313. RETURN ;返

  314. ;****************刹车中断服务程序***************
  315. BRAKE CALL PUSH ;保存现场
  316. BCF STATUS,RP0 ;回
  317. 存储区0
  318. BSF FLAG1,SHUTDOWN;置相应标志位
  319. BCF INTCON,INTF ;清
  320. 中断标志位
  321. CALL POP ;恢
  322. 复现场
  323. RETFIE ;中
  324. 断返回
  325. ;***************低电压保护处理子程序*****************
  326. POWER BCF FLAG1,LOWPOWER;清相应的标志位
  327. MOVF VOLTAGEH,0
  328. MOVWF ACCaHI
  329. MOVF VOLTAGEL,0
  330. MOVWF ACCaLO
  331. MOVLW VOLOFFH
  332. MOVWF ACCbHI
  333. MOVLW VOLOFFL
  334. MOVWF ACCbLO
  335. CALL D_sub
  336. BTFSC ACCbLO,7 ;判断当前电池电压值是否低
  337. 于保护电压(32V)
  338. RETURN ;不
  339. 是,返回
  340. BCF INTCON,INTE
  341. BCF T1CON,TMR1ON ;关闭电流采样
  342. MOVLW FULLPWM
  343. MOVWF CCPR1L
  344. BSF STATUS,RP0
  345. BCF PIE1,ADIE ;禁止AD采样中断
  346. BCF STATUS,RP0
  347. POWER3 BTFSC ADCON0,GO ;正在进行AD采样?
  348. GOTO POWER3 ;是,等待AD采样
  349. 完毕
  350. BCF PIR1,ADIF ;清AD采样中断标
  351. 志位
  352. BCF ADCON0,CHS0
  353. BSF ADCON0,CHS1 ;选择电压采样通

  354. MOVLW 0X06 ;延
  355. 时等待通道转换完成
  356. MOVWF COUNT
  357. POWER4 DECFSZ COUNT
  358. GOTO POWER4
  359. POWER6 BSF ADCON0,GO ;采样电池电压值
  360. POWER5 BTFSS PIR1,ADIF ;采样完毕?
  361. GOTO POWER5
  362. BCF PIR1,ADIF ;清AD中断标志位
  363. BCF STATUS,C
  364. MOVF ADRESH,0 ;当前电压值送被加数
  365. MOVWF ACCbHI
  366. BSF STATUS,RP0
  367. MOVF ADRESL,0
  368. BCF STATUS,RP0
  369. MOVWF ACCbLO
  370. MOVLW VOLONH ;35V电压值送被
  371. 加数
  372. MOVWF ACCaHI
  373. MOVLW VOLONL
  374. MOVWF ACCaLO
  375. CALL D_sub ;当前电压值减
  376. 35,与重开电压进行比较
  377. MOVLW FULLPWM
  378. MOVWF CCPR1L
  379. CLRWDT
  380. BTFSC ACCbHI,7 ;当前电压值大于35?
  381. GOTO POWER6 ;否,重新采样
  382. BSF FLAG1,OFF ;是,置相应的标
  383. 志位
  384. RETURN ;返

  385. ;***电机转子位置采样子程序,状态采样子程序,出口地址:STATE1***
  386. SAMPLE MOVLW AND ;读RB口
  387. ANDWF PORTB,0 ;分离出有效信息
  388. MOVWF STATE1 ;暂存状态值
  389. MOVLW 0X08
  390. MOVWF DELAY
  391. DEL1 DECFSZ DELAY ;延时6 μs

  392. GOTO DEL1
  393. MOVLW AND ;读
  394. RB口
  395. ANDWF PORTB,0 ;分离出有效信
  396. 息,并暂存
  397. MOVWF STATE2
  398. XORWF STATE1,0 ;与上一次状态值
  399. 相异或
  400. BTFSC STATUS,Z
  401. RETURN ;两
  402. 个状态值相等则返回
  403. MOVLW 0X06 ;否
  404. 则延时4 μs
  405. MOVWF DELAY
  406. DEL2 DECFSZ DELAY
  407. GOTO DEL2
  408. MOVLW AND ;读
  409. RB口
  410. ANDWF PORTB,0 ;提取有效信息并
  411. 暂存
  412. MOVWF STATE3
  413. XORWF STATE1,0 ;与第一次状态相
  414. 同吗?
  415. BTFSC STATUS,Z
  416. RETURN ;相
  417. 同则返回
  418. MOVF STATE2,0 ;否则再与第二次
  419. 状态相比较
  420. XORWF STATE3,0
  421. BTFSS STATUS,Z
  422. GOTO SAMPLE ;三次状态均不相
  423. 同则重新采样
  424. MOVF STATE2,0 ;第三次状态与第
  425. 二次相同,则将正确状态赋予STATE1并
  426. MOVWF STATE1 ;返回
  427. RETURN
  428. ;************** MOSFET触发信号输出子程序**************
  429. OUTPUT SWAPF STATE1,1 ;STATE1寄存器高低半字节互

  430. BCF STATUS,C ;清C位,并将
  431. STATE1寄存器左移一位
  432. RRF STATE1,0 ;将
  433. 采样所得结果放至W低三位
  434. CALL OUT_TABLE ;查表获得输出值
  435. MOVWF PORTC ;将输出值输出至
  436. RC口
  437. RETURN
  438. ;*************** RB口电平变化中断服务程序**************
  439. SAMPRB CALL PUSH ;现场保护
  440. BCF STATUS,RP0
  441. CALL SAMPLE ;采样RB口状态
  442. CALL OUTPUT ;根据RB口状态触
  443. 发相应的MOSFET
  444. CALL POP ;恢
  445. 复现场
  446. BCF INTCON,RBIF ;清
  447. RB口电平变化中断标志
  448. RETFIE ;中
  449. 断返回
  450. ;************ AD采样中断服务程序***************
  451. AD CALL PUSH ;保护现场
  452. BTFSC FLAG1,VOLTAGE ;是电压采样?
  453. GOTO SET_VOL ;是,作相应的处

  454. SET_TS BCF ADCON0,CHS0 ;AD采样值是TS,则选择1采
  455. 样通道
  456. INCF COUNT_VOL ;电压采样周期寄
  457. 存器值加1
  458. BTFSS STATUS,Z ;电压采样周期到?
  459. GOTO AD4
  460. BCF ADCON0,CHS0 ;是,选择2采样
  461. 通道
  462. BSF ADCON0,CHS1
  463. BSF FLAG1,VOLTAGE ;置相应的标志位

  464. AD4 BCF PIR1,ADIF ;清AD中断标志
  465. MOVF ADRESH,0 ;采样值送寄存器暂存
  466. MOVWF TSH
  467. BSF STATUS,RP0
  468. MOVF ADRESL,0
  469. BCF STATUS,RP0
  470. MOVWF TSL
  471. BSF FLAG1,PWM
  472. BTFSS FLAG1,VOLTAGE ;是否需要进行电压采样?
  473. GOTO AD6
  474. MOVLW 0X05 ;
  475. 是,延时后采样电压
  476. MOVWF TEMP1
  477. AD5 DECFSZ TEMP1
  478. GOTO AD5
  479. BSF ADCON0,GO
  480. AD6 CALL POP ;恢
  481. 复现场,中断返回
  482. RETFIE
  483. SET_VOL BCF ADCON0,CHS1 ;如果采样值为电
  484. 压值,则选择0通道
  485. BCF ADCON0,CHS0
  486. BCF PIR1,ADIF ;清中断标志位
  487. BCF FLAG1,VOLTAGE ;清相应标志位
  488. MOVF ADRESH,0 ;将采样结果放入被减数寄存

  489. MOVWF VOLTAGEH
  490. BSF STATUS,RP0
  491. MOVF ADRESL,0
  492. BCF STATUS,RP0
  493. MOVWF VOLTAGEL
  494. BSF FLAG1,LOWPOWER;是,置相应标志位
  495. CALL POP ;中
  496. 断返回
  497. RETFIE
  498. ;**************中断保护现场子程序******************
  499. PUSH MOVWF W_STACK ;暂存W寄存器
  500. MOVF STATUS,0 ;暂存STATUS寄存器
  501. MOVWF ST_STACK
  502. RETURN ;子
  503. 程序返回
  504. ;**************中断恢复现场子程序**************
  505. POP MOVF ST_STACK,0 ;恢复STATUS寄存
  506. 器值
  507. MOVWF STATUS
  508. MOVF W_STACK,0 ;恢复W寄存器值
  509. RETURN ;子
  510. 程序返回
  511. ;**************初始化子程序****************
  512. SETUP MOVLW  .15 ;初始化TEMP

  513. MOVWF  TEMP
  514. MOVF  ACCbHI,0 ;ACCb送ACCd
  515. MOVWF  ACCdHI
  516. MOVF  ACCbLO,0
  517. MOVWF  ACCdLO
  518. CLRF  ACCbHI ;清ACCb
  519. CLRF  ACCbLO
  520. RETLW  0
  521. ;**********乘除法运算确定结果符号子程序**********
  522. S_SIGN MOVF  ACCaHI,0 ;ACCaHI异或ACCbHI,结果送SIGN单元
  523. XORWF  ACCbHI,0
  524. MOVWF  SIGN
  525. BTFSS  ACCbHI,7 ;ACCb为负?
  526. GOTO  CHEK_A ;否,检查ACCa
  527. CALL NEG_B
  528. CHEK_A BTFSS  ACCaHI,7 ;ACCa为负?
  529. RETLW  0 ;
  530. ACCa和ACCb均为负,返回
  531. GOTO  NEG_A ;ACCa为负,取补
  532. GOTO MAIN
  533. END
  534. ;程序结束
复制代码


单片机控制的电动自行车驱动系统.doc

37 KB, 下载次数: 16, 下载积分: 黑币 -5


作者: 双赢电子    时间: 2016-6-6 16:46
这个资料太好了,技术贴顶贴
作者: tieq1952    时间: 2017-12-14 08:44
很需要它




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1