Variateur (Contrôleur) pour moteur BRUSHLESS
avec un Microcontrôleur ATMEGA8-16

J'ai longuement décrit et expliqué ici mon variateur Brushless basé sur un PIC16F628. Suite à cette première réalisation, qui fonctionnait mais n'était pas parfaite, j'ai voulu utliliser un microcontrôleur plus puissant tel que l'ATMEGA8.
Je débute donc l'étude de ce nouveau variateur. (On me fait remarquer que pour les moteurs brushless on parle plutôt de contrôleur...) Pour les principes de base, qui sont identiques, je vous renvoie sur la page du variateur à PIC.
Ce nouveau microcontrôleur est doté d'un convertisseur Analogique / Numérique, ce qui permettra de mesurer la tension d'alimentation (système BEC) ainsi que le courant débité.

1 Le schéma de la version d'évaluation:

Voici le schéma de la version d'évaluation, il va évoluer, en effet:

- Cette version ne gère pas les signaux de la télécommande
- Le moteur tourne au régime maximum tout le temps (pas de découpage des signaux de conduction)
- les transistors MOSFETS que j'ai utilisés actuellement  (IRF9Z24 pour les types canal-P) ont un rds-on énorme (280 milli-Ohm à comparer aux 12 milli-Ohm des MOSFET Si4463DY - SMD, canal P , 11A  que je compte utiliser par la suite). Donc cette version ne peut faire tourner que de petits moteurs de disques durs ou lecteurs de CDROM. Sur un moteur puissant de propulsion, c'est la destruction des MOSFETS assurée. (En fait, pour les essais, je travaille avec une alim régulée en tension ET limitée en courant...)

CE montage (tel quel) alimenté par un accu LIPO et connecté à un vrai moteur... C'est le feu d'artifice immédiat !  Je vous ai prévenu !

2 Le Firmware en laguage assembleur AVR:

CODE SOURCE en langage ASM
  1. ;=======================================================================
  2. ; VARIATEUR pour moteur BRUSHLESS a 3 fils : variat4.asm
  3. ; pour ATMEGA8 et Qx=16,000 Mhz
  4.  
  5. ;derniere mise a jour: 22/05/2006
  6. ; Version: 1.00
  7. ; Auteur: Silicium628
  8. ;=======================================================================
  9. ;Cette realisation fait suite a celle utilisant un PIC16F628
  10. ;=======================================================================
  11. ;PRINCIPE
  12.  
  13.  
  14. ;=======================================================================
  15.  
  16.  
  17. ;LISTE DES PARTIES:
  18.  
  19. ;Declaration des Variables
  20. ;MACROS
  21. ;Declaration des Vecteurs d'interruptions
  22. ;Routines de traitement des interruptions
  23. ;Programme de RESET
  24. ;initialisation des ports
  25. ;PROGRAMME PRINCIPAL
  26. ;ROUTINES
  27. ;STOP
  28. ;pasMoteur
  29. ;demarre
  30.  
  31. ;mul16_8 MULTIPLICATION 8 bits x 16 bits resultat sur 24 bits
  32. ;div24_8 DIVISION 24 bits par 8 bits, resultat sur 24 bits
  33.  
  34. ;=======================================================================
  35.  
  36.  
  37. .include "m8def.inc" ; nom du fichiers de references des registres (ATMEGA 8)
  38.  
  39.  
  40. ;------------------------------------------------------------------------
  41. ;Declaration des Variables
  42. ;------------------------------------------------------------------------
  43.  
  44. .def n_pas = r0
  45.  
  46. .def SAUVREG = r15 ; registre de sauvegarde de SREG
  47.  
  48. .def a=r16
  49. .def AA=r17
  50. .def BB=r18
  51.  
  52. .def Flags1 = r19 ;"mesflags1"
  53. ;Flags1[0]= incrementation demande
  54. ;Flags1[1]=
  55. ;Flags1[2]=
  56. ;Flags1[3]= MODE : (actuellement inutilise)
  57. ;Flags1[4]= Attente relachement des touches demande
  58.  
  59. ;r20..25 reserve pour les variables locales
  60. ;r26,27 reserve comme registre d'adresse d'indexation (X)
  61.  
  62.  
  63.  
  64. ;r30,31 reserve comme registre d'adresse d'indexation (Z) permet la lecture en memoire de programme
  65.  
  66. .DSEG
  67. nombre1: .BYTE 3 ;nombre code sur 3 octets (binaire) 0...16 777 216
  68. nombre2: .BYTE 3 ;""
  69.  
  70. dividende: .BYTE 3
  71. numerateur: .BYTE 1
  72. denominateur: .BYTE 1
  73.  
  74.  
  75.  
  76. ;------------------------------------------------------------------------
  77. ;MACROS
  78. ;------------------------------------------------------------------------
  79.  
  80. ;cette macro fait @0(variable en RAM, 24bits) := @1 valeur(24bits) pasee en parametre
  81. .MACRO Mset24
  82. ldi a,BYTE1(@1)
  83. sts @0+0,a
  84. ldi a,BYTE2(@1)
  85. sts @0+1,a
  86. ldi a,BYTE3(@1)
  87. sts @0+2,a
  88.  
  89. .ENDMACRO
  90.  
  91. ;------------------------------------------------------------------------
  92. ;cette macro fait @0(variable en RAM, 24bits) := r20,21,22
  93. .MACRO Mstore24
  94. sts @0+0,r20
  95. sts @0+1,r21
  96. sts @0+2,r22
  97.  
  98. .ENDMACRO
  99.  
  100. ;------------------------------------------------------------------------
  101. ;cette macro fait 3 registres successifs := @0 (variable en RAM, 24bits, pasee en parametre)
  102. .MACRO Mload24
  103. lds r20,@0+0
  104. lds r21,@0+1
  105. lds r22,@0+2
  106.  
  107.  
  108. .ENDMACRO
  109.  
  110.  
  111. ;------------------------------------------------------------------------
  112. ;Declaration des Vecteurs d'interruptions
  113. ;------------------------------------------------------------------------
  114.  
  115. .CSEG
  116. .ORG 0x0000 ;debut zone memoire programme
  117. rjmp RESET ;RESET
  118. rjmp EXT_INT0 ;Interruption externe INT0
  119. rjmp EXT_INT1 ;Interruption externe INT1
  120. rjmp TIM2_COMP ;Interrution comparaison reussie TIMER2
  121. rjmp TIM2_OVF ;Interrution debordement compteur TIMER2
  122. rjmp TIM1_CAPT ;Interrution entree capture TIMER1
  123. rjmp TIM1_COMPA ;Interrution comparateurA TIMER1
  124. rjmp TIM1_COMPB ;Interrution comparateurB TIMER1
  125. rjmp TIM1_OVF ;Interrution debordement compteur TIMER1
  126. rjmp TIM0_OVF ;Interrution debordement compteur TIMER0
  127. rjmp SPI_STC ;Interrution transmissions SPI terminee
  128. rjmp UART_RXC ;Interrution reception UART termine RX
  129. rjmp UART_DRE ;Interrution UART vide
  130. rjmp UART_TXC ;Interrution emission UART termine TX
  131. rjmp ADC_ok ;Interrution Conversion A/D terminee
  132. rjmp EE_RDY ;Interrution EEPROM prete
  133. rjmp ANA_COMP ;Interrution comparaison analogique effectuee
  134.  
  135. ;------------------------------------------------------------------------
  136. ;Routines de traitement des interruptions
  137. ;------------------------------------------------------------------------
  138. ;declenchee par les signaux de BEMF
  139. ;fait avancer le moteur d'un pas
  140.  
  141. EXT_INT0: in sauvreg,sreg
  142. push sauvreg
  143. push a
  144.  
  145. rcall pasMoteur
  146.  
  147. fin_int0: pop a
  148. pop sauvreg
  149. out sreg,sauvreg
  150. reti
  151. reti
  152.  
  153. ;------------------------------------------------------------------------
  154. EXT_INT1: reti
  155. ;------------------------------------------------------------------------
  156. TIM2_COMP:reti
  157. ;------------------------------------------------------------------------
  158. TIM2_OVF: reti
  159. ;------------------------------------------------------------------------
  160. TIM1_CAPT:reti
  161. ;------------------------------------------------------------------------
  162. TIM1_COMPA:reti
  163. ;------------------------------------------------------------------------
  164. TIM1_COMPB:reti
  165. ;------------------------------------------------------------------------
  166. TIM1_OVF: reti
  167. ;------------------------------------------------------------------------
  168. TIM0_OVF: reti
  169. ;------------------------------------------------------------------------
  170. SPI_STC: reti
  171. ;------------------------------------------------------------------------
  172. UART_RXC: reti
  173. ;------------------------------------------------------------------------
  174. UART_DRE: reti
  175. ;------------------------------------------------------------------------
  176. EE_RDY: reti
  177. ;------------------------------------------------------------------------
  178. ANA_COMP: reti
  179. ;------------------------------------------------------------------------
  180. ADC_ok: reti
  181. ;------------------------------------------------------------------------
  182. UART_TXC: reti
  183. ;------------------------------------------------------------------------
  184. UART_RXC1:reti
  185. ;------------------------------------------------------------------------
  186.  
  187.  
  188. ;------------------------------------------------------------------------
  189. ;Programme de RESET
  190. ;------------------------------------------------------------------------
  191.  
  192. cli
  193.  
  194. texte: .DB 'V','A','R','I','A','T','E','U','R' ;Pour reperer facilement le bon .ASM dans PonyProg!
  195. ;(evite de grosses meprises lorsque je travaille sur plusieurs softs en meme temps...)
  196.  
  197. RESET: ldi a,low(RAMEND)
  198. out SPL,a ; Initialisation de la pile a
  199. ldi a,high(RAMEND) ; l'adresse haute de la SRAM
  200. out SPH,a
  201. ;------------------------------------------------------------------------
  202. ;initialisation des ports
  203. ;PORT A:
  204. ldi a,0b00000000 ;toutes en entree
  205. out ddrd,a
  206. ldi a,0b11111111 ;R de tirage
  207. out portd,a
  208.  
  209. ;PORT B:
  210. ldi a,0b11111111 ;toutes en sorties
  211. out ddrb,a
  212.  
  213. ;PORT C:
  214. ldi a,0b11111111 ;toutes en sorties
  215. out ddrc,a
  216. clr a
  217. out portc,a ;sorties = 0
  218.  
  219. ;------------------------------------------------------------------------
  220. ;wachtdog
  221. ; wdr
  222. ; ldi a,0b00001111 ; wachtdog enable; delai = 2s (voir p:82)
  223. ; out wdtcr,a
  224.  
  225. wdr
  226. ldi a,0b00011111
  227. out wdtcr,a
  228. ldi a,0b00010111
  229. out wdtcr,a ; disable le wachtdog. (voir p:83)
  230.  
  231.  
  232. ;------------------------------------------------------------------------
  233. ;TIMSK
  234. ;Timer Interrupt Mask; voir pdf p:70
  235. ;bit7 (OCIE2)
  236. ;bit6 (TOIE2)
  237. ;bit5 (TICIE1) Timer/Counter1, Input Capture Interrupt Enable
  238. ;bit4 (OCIE1A) Timer/Counter1, Output Compare A Match Interrupt Enable
  239. ;bit3 (OCIE1B) Timer/Counter1, Output Compare B Match Interrupt Enable
  240. ;bit2 (TOIE1) Timer/Counter1, Overflow Interrupt Enable
  241. ;bit1 inutilise
  242. ;bit0 (TOIE0) Timer/Counter0 Overflow Interrupt Enable - voir Tavernier p:96
  243.  
  244. ; 76543210
  245. ldi a,0b00010001 ;Timer1 Output Compare A Match Interrupt Enable ;Timer0 Overflow Interrupt Enable
  246. out TIMSK,a
  247. ;------------------------------------------------------------------------
  248. ;TCCR0
  249. ;definit le mode de fonctionnement du Timer0
  250. ;bits7a3 = non utilise
  251. ;bits2,1,0 = taux de predivision de l'horloge voir Tavernier p:87
  252. ;16MHz/1024 = 15625 Hz
  253.  
  254. ; 76543210
  255. ldi a,0b00000101 ;1/1024 (voir tableau Tavernier p:88)
  256. out TCCR0,a
  257. ;------------------------------------------------------------------------
  258. ;TCCR1A
  259. ;definit le mode de fonctionnement du Timer1
  260. ;voir Tavernier p:93
  261.  
  262. ;bit7 (COM1A1) ;definit le comportement de la sortie OC1A
  263. ;bit6 (COM1A0)
  264. ;bit5 (COM1B0)
  265. ;bit4 (COM1B1)
  266. ;bit3,2 NC
  267. ;bit1 (PWM11)
  268. ;bit0 (PWM10)
  269.  
  270. ; 76543210
  271. ldi a,0b00000000 ;voir tableau Tavernier p:93
  272. out TCCR1A,a
  273. ;------------------------------------------------------------------------
  274. ;TCCR1B
  275. ;definit le mode de fonctionnement du Timer1
  276. ;voir Tavernier p:94-95 ;et p:81-82 du datasheet.pdf
  277.  
  278. ;bit7 (ICNC1): enable/disable reducteur de bruit
  279. ;bit6 (ICES1)=1: transfert du registre de comptage TCNT1 dans le registre de capture ICR1 sur front montant du pin ICP
  280. ;bit5 : inutilise
  281. ;bit4 : inutilise
  282. ;bit3 (WGM12 ou CTC1): raz registre de comptage (TCNT1) apres comparaison
  283. ;bits2,1,0: taux de predivision applique a l'horloge systeme. voir Tavernier p:95
  284.  
  285. ; 76543210
  286. ldi a,0b00001110 ;horloge externe pour le Timer1, RAZ du compteur (TCNT1) lors de comparaison OK
  287. out TCCR1B,a
  288. ;------------------------------------------------------------------------
  289. ;MCUCR
  290. ;voir datasheet p:31
  291. ;bits[3,2] -> ISC11 ISC10 Description
  292. ;0 0 The low level of INT1 generates an interrupt request.
  293. ;0 1 Any logical change on INT1 generates an interrupt request.
  294. ;1 0 The falling edge of INT1 generates an interrupt request.
  295. ;1 1 The rising edge of INT1 generates an interrupt request.
  296.  
  297. ;bits[1,0] -> ISC01 ISC00 Description
  298. ;0 0 The low level of INT0 generates an interrupt request.
  299. ;0 1 Any logical change on INT0 generates an interrupt request.
  300. ;1 0 The falling edge of INT0 generates an interrupt request.
  301. ;1 1 The rising edge of INT0 generates an interrupt request.
  302.  
  303. ; 76543210
  304. ldi a,0b00000001 ;Any logical change on INT0 generates an interrupt request.
  305. out MCUCR,a ;voir p:64 du datasheet.pdf et Tavernier p:30
  306.  
  307. ;------------------------------------------------------------------------
  308. ;GICR (GENERAL INTERRUPT CONTROL REGISTER)
  309. ;page 47 et 65 du datasheet
  310. ;bit 7 = INT1 enable
  311. ;bit 6 = INT0 enable
  312.  
  313. ; 76543210
  314. ldi a,0b01000000 ;INT0 enable
  315. out GICR,a
  316.  
  317. ;------------------------------------------------------------------------
  318. initvar:
  319.  
  320. ldi Flags1,0b00000000
  321. clr n_pas
  322. rcall STOP
  323.  
  324. ;chargement du registre de comparaison (A) du Timer1
  325. ; cli
  326. ; ldi r20,LOW(59) ;588
  327. ; ldi r21,HIGH(59) ;588
  328. ; out OCR1AH,r21
  329. ; out OCR1AL,r20
  330. ; sei ;Sets the Global Interrupt flag (I) in SREG (status register)
  331.  
  332.  
  333. ;------------------------------------------------------------------------
  334. ;zone de tests de procedures
  335.  
  336.  
  337. ;------------------------------------------------------------------------
  338. ;PROGRAMME PRINCIPAL
  339. ;------------------------------------------------------------------------
  340.  
  341. sei ;Sets the Global Interrupt flag (I) in SREG (status register)
  342.  
  343. rcall demarre
  344. ;------------------------------------------------------------------------
  345. ;BOUCLE PRINCIPALE
  346.  
  347. bcl0: nop
  348.  
  349. rcall tp1ms
  350.  
  351. rjmp bcl0
  352.  
  353. ;------------------------------------------------------------------------
  354. ;ROUTINES
  355. ;------------------------------------------------------------------------
  356. STOP: cli
  357. clr a
  358. out pinc,a
  359. ret
  360.  
  361. ;------------------------------------------------------------------------
  362. pasMoteur:inc n_pas
  363. mov a,n_pas
  364. cpi a,6
  365. brlo int0b
  366. clr n_pas
  367.  
  368. int0b: mov a,n_pas
  369. rcall lire_Ph
  370.  
  371. out portc,a
  372. ret
  373.  
  374. ;------------------------------------------------------------------------
  375. demarre: cli
  376. ldi AA,20 ;2
  377.  
  378. dema1: ldi BB,10 ;8
  379.  
  380. dema2: rcall pasMoteur
  381.  
  382. ldi a,1 ;2
  383. add a,AA
  384. rcall tx1ms ;delai proportionnel a AA +2 donc qui decroit avec AA -> f augmente
  385. dec BB
  386. brne dema2 ;boucle interieure courte, BB fois
  387.  
  388. dec AA
  389. brne dema1 ;boucle exterieure, AA fois
  390.  
  391. cli
  392. rcall STOP ;moteur en roue libre
  393.  
  394. ldi a,10
  395. rcall tx1ms
  396.  
  397. sei ;re-autorie les INTs
  398. ret
  399.  
  400. ;------------------------------------------------------------------------
  401. ;tableau des valeurs des bits de commande des phases (en memoire de programme)
  402. ;'a' doit contenir la position dans le tableau (0..7)
  403. ;la routine retourne la valeur lue dans 'a'
  404. lire_Ph: ldi ZH, high(Table_1<<1);Initialize Z pointer (le shift gauche because le LSB est reserve. voir doc)
  405. ldi ZL, low(Table_1<<1)
  406. andi ZL,0b11111110 ;RAZ LSB pour acceder aux octets de poids faible
  407. lsl a ;shift gauche aussi
  408. add ZL,a ;decallage dans le tableau (voir plus bas)
  409. clr a
  410. adc ZH,a
  411. lpm a, Z ;Load constant from program
  412. ret
  413.  
  414. Table_1: .DB 0b00000110 ;phase 0
  415. .DB 0b00100100 ;phase 1
  416. .DB 0b00100001 ;phase 2
  417. .DB 0b00001001 ;phase 3
  418. .DB 0b00011000 ;phase 4
  419. .DB 0b00010010 ;phase 5
  420.  
  421.  
  422. ;------------------------------------------------------------------------
  423. EE_write: cli ;stop INT
  424.  
  425. sbic EECR,EEWE
  426. rjmp EE_write ; Wait for completion of previous write
  427.  
  428. out EEARH, r18; Set up address (r18:r17) in address register
  429. out EEARL, r17
  430. out EEDR,a ; Write data (r16) to data register
  431. sbi EECR,EEMWE; Write logical one to EEMWE
  432.  
  433. sbi EECR,EEWE ; Start eeprom write by setting EEWE
  434.  
  435. sei ;INT ON
  436. ret
  437.  
  438. ;------------------------------------------------------------------------
  439.  
  440. EE_read: sbic EECR,EEWE
  441. rjmp EE_read ; Wait for completion of previous write
  442.  
  443. out EEARH, r18; Set up address (r18:r17) in address register
  444. out EEARL, r17
  445. sbi EECR,EERE ; Start eeprom read by writing EERE
  446.  
  447. in a,EEDR ; Read data from data register
  448. ret
  449.  
  450.  
  451. ;----------------------------------------------------------------------
  452. ;ADDITION de registres sur 3 octets
  453. ;r20,21,22:= r20,21,22 + r0,r1,r2
  454.  
  455. add24r: add r20,r0
  456. adc r21,r1
  457. adc r22,r2
  458. ret
  459.  
  460.  
  461. ;----------------------------------------------------------------------
  462. ;ADDITION sur 3 octets (1)
  463. ;r20,21,22:= r20,21,22 + nombre1
  464.  
  465. add24a: lds a,nombre1+0
  466. add r20,a
  467. lds a,nombre1+1
  468. adc r21,a
  469. lds a,nombre1+2
  470. adc r22,a
  471. ret
  472.  
  473. ;----------------------------------------------------------------------
  474. ;ADDITION sur 3 octets (2)
  475. ;nombre1:= nombre1 +nombre2
  476.  
  477. add24b: push AA
  478. push BB
  479. lds AA,nombre1+0
  480. lds BB,nombre2+0
  481. add AA,BB
  482. sts nombre1+0,AA
  483.  
  484. lds AA,nombre1+1
  485. lds BB,nombre2+1
  486. adc AA,BB
  487. sts nombre1+1,AA
  488.  
  489. lds AA,nombre1+2
  490. lds BB,nombre2+2
  491. adc AA,BB
  492. sts nombre1+1,AA
  493. pop BB
  494. pop AA
  495. ret
  496.  
  497. ;----------------------------------------------------------------------
  498. ;MULTIPLICATION 8 bits x 16 bits resultat sur 24 bits
  499. ;multiplie r20(poids faible),r21 , r22(poids fort) par 'a'
  500. ;produit dans r20,r21,r22
  501.  
  502. .def produit0=r20 ;produit poids faible
  503. .def produit1=r21 ;produit
  504. .def produit2=r22 ;produit poids fort
  505. .def n1=r23
  506.  
  507. mul16_8: ldi n1,17 ;compteur de boucle
  508.  
  509. mul16_81: ror produit2
  510. ror produit1
  511. ror produit0
  512.  
  513. brcc mul16_82 ;lecture d'un bit de r20 ; test de ce bit
  514. add produit2,a ;si c' est un '1' on ajoute 'a' a A2
  515.  
  516. mul16_82: dec n1
  517. brne mul16_81
  518.  
  519. ret
  520.  
  521. ;----------------------------------------------------------------------
  522. ;DIVISION 24 bits par 8 bits, resultat sur 24 bits
  523. ;note; le quotient est stocke dans le dividende; permet de decaller les deux a la fois
  524.  
  525. ;r20,21,22 doivent contenir le dividende (r20=LSB)
  526. ;r23 doit contenir le diviseur
  527. ;resultat (Quotient) dans r20 (LSB) et r21 et r22
  528. ;reste dans r24
  529. ;le bit T=1 indique un debordement
  530.  
  531. .def Dividend0=r20 ;pour la routine Div24_8
  532. .def Dividend1=r21 ;pour la routine Div24_8
  533. .def Dividend2=r22 ;pour la routine Div24_8
  534. .def Diviseur =r23 ;pour la routine Div24_8.
  535. .def Aux0=r24 ;pour la routine Div24_8
  536. .def Aux1=r25
  537. .def n1=r16 ;attention: ecrase r16 (=a)
  538.  
  539. div24_8: ldi n1,24
  540. clr Aux0 ;clrf Aux+0
  541.  
  542. div24_80: lsl Dividend0
  543. rol Dividend1
  544. rol Dividend2
  545.  
  546. div24_81: rol Aux0 ;decalle le dividende dans 'Aux' (passage d'un bit par "c")
  547. rol Aux1
  548.  
  549. cp aux0,Diviseur
  550. brlo auxPetit
  551.  
  552. auxGrand: sub Aux0,Diviseur
  553. sec
  554. rjmp saut1
  555.  
  556. auxPetit: clc
  557.  
  558. saut1: rol Dividend0 ;decalle a gauche en incorporant 'c' comme bit 0
  559. rol Dividend1 ;decalle a gauche avec passage d'un bit par "c"
  560. rol Dividend2 ;decalle a gauche et envoie un bit par 'c' dans 'Aux' (apres le saut)
  561.  
  562. dec n1 ;important: ne touche pas a 'c'
  563. brne Div24_81
  564.  
  565. ret
  566.  
  567. ;----------------------------------------------------------------------
  568. ;TEMPO 1ms exactement avec un Qx=16.000MHz
  569. ;attention: sous reserve de ralentissement par les interruptions...
  570.  
  571. .def i1=r20
  572. .def i2=r21
  573.  
  574. tp1ms: push r20
  575. push r21
  576.  
  577. ldi i1,16
  578. bcl2: ldi i2,248
  579. bcl3: dec i2
  580. brne bcl3
  581.  
  582. nop ;pour ajuster exactement la duree
  583. nop
  584. nop
  585. dec i1
  586. brne bcl2
  587.  
  588. nop
  589. pop r20
  590. pop r21
  591. ret
  592.  
  593.  
  594. ;----------------------------------------------------------------------
  595. ;tempo a * 1ms
  596. tx1ms: push r16
  597. .def n=r16
  598.  
  599. mov n,a
  600. bcl7: rcall tp1ms
  601. dec n
  602. brne bcl7
  603.  
  604. pop r16
  605. ret
  606.  
  607. ;----------------------------------------------------------------------
  608. ;tempo a * 100ms
  609. ;a qui contient le nb de fois 100ms est affecte
  610. .def n=r16
  611.  
  612. tx100ms: push r16
  613.  
  614. ldi n,100
  615. bcl6: rcall tp1ms
  616. dec n
  617. brne bcl6
  618. pop r16
  619. dec a
  620. brne tx100ms
  621. ret
  622.  
  623. ;----------------------------------------------------------------------
  624.  

3 Le circuit imprimé

Comme on le voit, il ne devrait y avoir que 6 interconnexions entre les 2 circuits. Les pistes ne font que 0,3mm de large.

J'ai tiré les deux cartes sur le même support, ça simplifie le travail.

4 Détail de l'emplacement du microcontroleur ATMEGA8:

5 -

Un conseil, pour réussir le soudage d'un composant microscopique plein de pattes comme celui-ci:

  • le positionner, souder une seule patte, puis observer le résultat à la loupe.
  • Ce n'est que lorsque le positionnement est parfait qu'on peut souder une deuxième patte (de préference disposée dans le coin en diagonale)
  • recontrôler à la loupe
  • puis souder toutes les autres pattes.
Bien entendu il faut équiper le fer avec une panne CMS (pointue comme une aiguille) et utiliser de la soudure spéciale CMS (diam = 0,5mm)

6 Principaux composants en place:

7 Une autre astuce;

Comment immobiliser un composant CMS pendant le soudage, tout en tenant la soudure et le fer à souder ? Il faut trois mains ! (quatre pour les fumeurs). Donc embaucher un chimpanzé.

Moi je préfère immobiliser le composant avec un cure-dent...

...cure-dent tenu par une pince en plastique comme on en trouve partout dans les grandes surfaces. Le poids de la pince suffit à assurer une grande stabilité de l'ensemble.

8 -

17 juin 2006:

Je vous donne des nouvelles de la version CMS: (j'y consacre c'est vrai, peu de temps...)
Ce montage a fonctionné du... deuxième coup. Il n'y avait pas d'erreur dans le circuit imprimé (à ce sujet il faut noter que EAGLE est un soft formidable. Lorsque les tests ERC et DRC sont Ok, il y a fort à parier que le circuit fonctionnera) mais une pastille trop proche d'une piste sur la petite carte, créait un court-circuit (au niveau du cuivre)  entre GND et (13)de IC2D. 
(à moi de durcir un peu les règles DRC, en augmentant la 'clearance' entre wire et pad, 8mil ce n'est pas assez).
Il faudra aussi nettement élargir les pistes d'alimentation de puissance.

Donc le moteur de Disque Dur démarre et tourne, et les signaux de sortie sont propres.

La suite de la mise au point sera essentiellement logicielle, à savoir:
  • ajustement du timing (angle d'avance à la commutation). Etant donné la puissance des uC ATMEGA, facile! (à noter que cela n'était pas fait sur la version PIC16F628)
  • découpage des signaux (en HF ou en BF je n'ai pas encore décidé) pour ajuster la vitesse.
  • acquisition et traitement d'un signal de télécommande de vitesse (facile!)
  • limitation du courant (sécurité) et détection d'un bloquage du moteur.
  • frein (en option).

9 -



31340