Variateur pour moteur Speed 400
avec un microcontrôleur PIC16C84

La carte électronique décrite ici permet de faire varier la vitesse de rotation d'un moteur de type "speed400" (ou équivalent) en fonction des signaux PPM reçus par le récepteur de radio-commande.

1 -

Le speed400 en question est un moteur électrique classique (à collecteur, balais et charbons, stator à aimant permanent) à grande vitesse de rotation (18 000 tr/mn) avantageusement utilisé avec un réducteur couplé à une grande hélice, pour la propulsion d'avions modèle réduits.

2 Principales fonctions du firmware du microcontroleur PIC:

  • gestion temps réel
  • pilotage d'un MOSFET par le PIC
  • gestion interruptions et Timer du PIC
  • implémentation d'un périodemètre

3 Le modèle réduit pour les essais:

Ce moto-planeur (de 2m d'envergure) a volé avec le montage décrit ici

4 La carte électronique connectée au moteur:

5 LE SCHEMA

6 Le firmware pour le PIC en langage assembleur PIC

CODE SOURCE en langage ASM
  1. ;VARIAT.ASM
  2. ;Variateur de vitesse pour moteur Speed 400 (pour Aeromodelisme)
  3. ;commande par une voie du recepteur de radiocommande
  4. ;pour Qx=3,2768Mhz
  5. ;RAPPEL REGISTRE D'ETAT = STATUS : p:30
  6. ;(pages indiquees: Les micr.PIC descrip. Ch.Tavernier - Edition DUNOD 1995)
  7. ;----------------------------------------------------------------------
  8. ;
  9. ; w = 7
  10. ; wreg = 7
  11. ;
  12. LIST P=PIC16C84
  13. ;qq
  14. include p16c84.inc
  15.  
  16. ;SVP definir ScratchPadRam ici:
  17. ;Si vous utilisez un PIC16C5X definissez "departRam equ 0x10"
  18. ;sinon definissez "departRam equ 0x20"
  19. ;----------------------------------------------------------------------
  20. w equ 0
  21. f equ 1
  22.  
  23. ;attention: le PIC16C84 possede 36 octets de RAM
  24. ;adresses OCh a 2Fh
  25. ;attention: le nb qui suit Ram0+... doit etre ecrit en Hexa !
  26.  
  27. Ram0 equ 000C
  28.  
  29. WW equ Ram0+00 ;pour sauvegarder w pendant INT
  30.  
  31. t1 equ Ram0+01 ;pour les tempos
  32. t2 equ Ram0+02
  33. t3 equ Ram0+03
  34. t4 equ Ram0+04
  35.  
  36. periode equ Ram0+05
  37.  
  38. cycl1 equ Ram0+06 ;rapport cyclique ver moteur = 1..20
  39. autori equ Ram0+07
  40. memo1 equ Ram0+08
  41. compte equ Ram0+09
  42. fr1 equ Ram0+0A
  43. nb_hs equ Ram0+0B
  44.  
  45. ;----------------------------------------------------------------------
  46.  
  47. org 0 ;start address 0
  48.  
  49. goto start
  50.  
  51. ;----------------------------------------------------------------------
  52. ;traitement interruption
  53. ;ici debordement du Timer0
  54. ;gene de rapport cyclique variable
  55. ;cree un signal de periode totale de 16ms (fixe)
  56. ;dont le temps a 1 est variable en une centaine de pas
  57. ;3.2768Mz/4/1/128=6400Hz (0.15625ms)
  58. ;3.2768Mz/4/1/32=25600Hz (39us)
  59. ;25600 /80 = 320 Hz
  60.  
  61. org 0004 ;INT
  62. movwf WW
  63.  
  64. movlw .256 - .32 ;ici on passe tous les
  65. movwf TMR0
  66.  
  67. movf cycl1,w
  68. subwf t4,w ;positionne c
  69. btfss STATUS,0 ;test bit carry
  70. goto int1
  71.  
  72. bcf PORTA,0
  73.  
  74. goto int2
  75.  
  76. int1 btfsc autori,0
  77. bsf PORTA,0
  78.  
  79. int2 decfsz t4,f
  80. goto finint
  81. movlw .80
  82. movwf t4
  83.  
  84.  
  85. finint bcf INTCON,2 ;re-autorise int Timer0 voir p:136 et p:156
  86.  
  87. movf WW,w
  88. retfie
  89.  
  90.  
  91. ;----------------------------------------------------------------------
  92. ;INITIALISATION DES PORTS
  93. ;----------------------------------------------------------------------
  94. ;PA0=sortie moteur vers NMOS ( IRFZ44 )
  95. ;PA1=sortie frein vers BC549C et PMOS ( IRF9640 )
  96. ;PA2=entree signal voie gaz
  97. ;PA3=entree mesure tension alim en amont du 78L05
  98. ;PB0=sortie signal alim faible (LED)
  99. ;PB1=sortie signal INIT (LED)
  100.  
  101. org 0020
  102.  
  103.  
  104. start clrwdt
  105.  
  106.  
  107. movlw B'00001100' ;0=sortie 1=entree (RA4=aussi RTCC)
  108. TRIS PORTA ;config du port A (TRISA en page 1)
  109. movlw B'11111100'
  110. TRIS PORTB ;config du port B
  111.  
  112. bcf PORTA,0 ;sortie VMOS IRFZ 44
  113. ;----------------------------------------------------------------------
  114. ;PROGRAMMATION DU REGISTRE OPTION
  115. ;VOIR page 144 et 143
  116. ;soit chien = 1/128 -> PS2,1,0 = 111b VOIR PAGE 135
  117. ;PSA (bit3) = 1 -> prediv affecte au chien voir p:73
  118. ;RTE (bit4) = 0 -> inc sur front montant
  119. ;RTS (bit5) = 0 -> branche Timer0 sur horloge interne
  120. ;INTEDG=x
  121. ;RBPU (bit7)= 0-> R tirage a Vdd du port B
  122.  
  123.  
  124. ; bits: 76543210
  125. movlw B'00001111'
  126. OPTION
  127. ;----------------------------------------------------------------------
  128.  
  129. ;PROG DU REGISTRE INTCON
  130. ;voir page 155 et surtout p:136
  131. ;bit0 RBIF=x (sortie?)
  132. ;bit1 INTF=x (sortie?)
  133. ;bit2 RTIF=x (SORTIE?)
  134. ;bit3 RBIE=0 -> INT du port RB4 a RB7 interdites.
  135. ;bit4 INTE=0 -> INT de RB0/INT interdite.
  136. ;bit5 RTIE=1 -> INT par debordement Timer0
  137. ;bit6 EEIE=0 -> INT EEPROM interdites
  138. ;bit7 GIE=1 ->INT GLOBALE autorisee.
  139.  
  140. movlw B'10100000'
  141. movwf INTCON
  142.  
  143.  
  144. ;----------------------------------------------------------------------
  145. clrf autori ;pas d'autorisation de mise en marche
  146. clrf periode
  147. bcf PORTA,0 ;RAZ sortie VMOS IRFZ 44
  148. bsf PORTB,1 ;LED INIT
  149. call tp10ms
  150. bsf PORTA,1 ;Freine
  151.  
  152. movlw .100
  153. movwf memo1
  154. movlw .10
  155. movwf compte
  156. movlw .6
  157. movwf t4
  158. movlw .1
  159. movwf cycl1
  160. movlw .20
  161. movwf fr1
  162. call tp100ms
  163. bcf PORTB,1 ;eteint LED INIT
  164.  
  165. movlw .3 ;(nombre d'essais)+1 de remise en route si accu hs
  166. movwf nb_hs ;avant de declarer forfait definitif
  167.  
  168. ;-----------------------------------------------------------------------
  169. ;essai
  170.  
  171. ;----------------------------------------------------------------------
  172. ;BOUCLE PRINCIPALE
  173.  
  174.  
  175. loop1 clrwdt
  176. btfss PORTA,3 ;mesure tension alim (detecte effondr. 78L05)
  177. goto alimOK
  178.  
  179. alimHS clrwdt
  180. clrf autori
  181. bcf PORTA,0 ;STOP
  182. movlw .100
  183. movwf memo1
  184. clrf cycl1
  185. clrf periode
  186. bsf PORTB,0 ;allume LED alim faible
  187. movlw .20
  188. call tx100ms
  189. bsf PORTA,1 ;Frein
  190. decfsz nb_hs
  191. goto loop1
  192.  
  193.  
  194. incf nb_hs ;sinon de passera de 0 a 255
  195. goto alimHS
  196.  
  197. alimOK bcf PORTB,0 ;eteint LED alim faible
  198.  
  199. suite7 decfsz compte,f
  200. goto suite5
  201.  
  202. clrf periode
  203. call acq_t ;1 fois sur 10...
  204. movlw .10
  205. movwf compte
  206.  
  207. suite5 bcf STATUS,0
  208. movf memo1,w
  209. subwf periode,w
  210. btfsc STATUS,2 ;bit z
  211. goto suite4 ;egalite : on ne change pas memo1
  212. btfsc STATUS,0 ;bit c
  213. goto suite3
  214.  
  215. decf memo1,f
  216. decf memo1,f
  217. goto suite4
  218.  
  219. suite3 incf memo1,f
  220.  
  221. suite4 movlw .160
  222. subwf memo1,w ;periode = periode - 130
  223. movwf cycl1
  224.  
  225. movlw .170 ;si (signal < 140 ) -> stop
  226. subwf memo1,w
  227. btfsc STATUS,0
  228. goto suite1 ;si (signal > 140 ) -> marche
  229.  
  230. stop clrf autori
  231. bcf PORTA,0 ;STOP
  232. movlw .150 ;si (signal < 130 ) -> stop + frein
  233. subwf memo1,w
  234. btfsc STATUS,0
  235. goto suite2
  236.  
  237. frein decfsz fr1 ;freine si 20 signaux consecutifs < 120
  238. goto suite2
  239. incf fr1 ;fr1=1
  240. clrf autori ;par securite
  241. bcf PORTA,0 ;re-STOP par securite
  242. bsf PORTA,1 ;Frein
  243. goto suite2
  244.  
  245. suite1 bcf PORTA,1 ;RAZ frein
  246. movlw .20
  247. movwf fr1
  248. bsf autori,0
  249.  
  250.  
  251. suite2 ;movlw .5
  252. call tp10ms
  253.  
  254. goto loop1
  255.  
  256. ;----------------------------------------------------------------------
  257. ;DEBUT DES PROCEDURES
  258. ;----------------------------------------------------------------------
  259. ;PERIODEMETRE (sur 1 octet)
  260. ;cette procedure est une autre version simplifiee de acqui_t (sur 2 octets)
  261. ;attention, n'efface pas periode mais cumule les temps dans cette variable
  262. ;attendre niveau bas
  263. ;on est peut etre deja en niv bas au depart de la procedure
  264. ;donc attendre ensuite niv haut
  265. ;attend niv bas
  266. ;fin comptage
  267.  
  268. ;de sorte que la mesure = temps signal a 1
  269.  
  270.  
  271. acq_t nop
  272. acloop1 btfsc PORTA,2 ;saute le goto si niv bas
  273. goto acloop1 ;attend niv bas si niv haut
  274.  
  275. acloop2 btfss PORTA,2 ;saute le goto si niv haut
  276. goto acloop2 ;attend niv haut si niv bas
  277.  
  278. ;re-PROG DU REGISTRE INTCON
  279. bcf INTCON,7 ;INT GLOBALE interdite
  280.  
  281. acloop3 incfsz periode,f ;mesure ici 1t
  282. goto acq2
  283. decf periode,f ;ecrete a 255 (ne repasse pas a 0)
  284.  
  285. acq2 btfsc PORTA,2 ;saute le goto si niv bas 1t
  286. goto acloop3 ;attend niv bas si niv haut 2t
  287.  
  288.  
  289. ;re-PROG DU REGISTRE INTCON
  290. bsf INTCON,7 ;INT GLOBALE autorisee
  291.  
  292. return
  293.  
  294. ;--------------------------------------------------------------------
  295.  
  296. ; Qx = 3,2768Mhz
  297.  
  298. tp300us movlw .79
  299. movwf t1
  300.  
  301. t3loop1 decfsz t1,f
  302. goto t3loop1
  303. return
  304.  
  305. ;----------------------------------------------------------------------
  306. ; Qx = 3,2768Mhz
  307.  
  308. tp2ms clrwdt
  309. movlw .16
  310. movwf t1
  311.  
  312. t4loop1 movlw .32
  313. movwf t2
  314.  
  315. t4loop2 decfsz t2,f
  316. goto t4loop2
  317. decfsz t1,f
  318. goto t4loop1
  319. return
  320.  
  321. ;----------------------------------------------------------------------
  322. ; Qx = 3,2768Mhz
  323.  
  324. tp10ms clrwdt
  325. movlw .82
  326. movwf t1
  327.  
  328. t1loop1 movlw .32
  329. movwf t2
  330.  
  331. t1loop2 decfsz t2,f
  332. goto t1loop2
  333. decfsz t1,f
  334. goto t1loop1
  335. return
  336.  
  337. ;----------------------------------------------------------------------
  338. ; Qx = 3,2768Mhz
  339.  
  340. tp100ms clrwdt
  341. movlw .170
  342. movwf t1
  343.  
  344. t2loop1 movlw .160
  345. movwf t2
  346.  
  347. t2loop2 clrwdt
  348. decfsz t2,f
  349. goto t2loop2
  350. decfsz t1,f
  351. goto t2loop1
  352. return
  353. ;----------------------------------------------------------------------
  354. ; Qx = 3,2768Mhz
  355. ;tempo n x 100ms
  356. ;charger w avec n avant l'appel de cette procedure
  357.  
  358. tx100ms clrwdt
  359. movwf t3
  360.  
  361. txloop clrwdt ;chien de garde
  362. call tp100ms
  363. decfsz t3,f
  364. goto txloop
  365. return
  366.  
  367. ;----------------------------------------------------------------------
  368. ; Qx = 3,2768Mhz
  369. ;tempo n x 10ms
  370. ;charger w avec n avant l'appel de cette procedure
  371.  
  372. tx10ms clrwdt
  373. movwf t3
  374.  
  375. txlp2 clrwdt ;chien de garde
  376. call tp10ms
  377. decfsz t3,f
  378. goto txlp2
  379. return
  380. ;----------------------------------------------------------------------
  381.  
  382. ORG 2007H ; Fuses
  383. DATA 3FF5 ;osc=XT
  384.  
  385.  
  386. end
  387.  
  388.  
  389.  
  390.  

7 Note:

Cette réalisation date de 2001... Le PIC 16C84 pourrait être remplacé par un PIC16F628 pour les fanas des PIC. Personnellement il y a bien longtemps que j'utilise la famille AVR ATmega de chez Atmel, dont je développe les sources en langage C avec des outils libres sous l'OS Linux. Quant au speed400, on a fait mieux depuis avec les moteurs brushless (sans balais, à cage tournante). Je décris sur ce site un contrôleur pour moteur brushless avec justement un ATmega8 programmé en C.

8 -



14264