FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  [PIC][C] Commande de servomoteur PWM 16F84

 




Il y a 40 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PIC][C] Commande de servomoteur PWM 16F84

n°7400
force-pc
Pas de zap :(
Posté le 07-06-2007 à 13:51:33  profilanswer
 

Salut à tous,
 
Pour mon premier post j'aurai besoin d'aide pour piloter un servomoteur à partir d'un pic 16F84.
En entrée, on a donc 4 bits (16 états), en sortie de la PWM.
 


Exemple avec 3 possibilités
Entrée       angle                      durée impulsion
0000         102 deg (butée)        0.51 ms
0111         milieu                      1.44 ms  
1111         98.8 deg (butée)       2.31 ms  


Periode : 20ms
8µs => 0.89 deg.
1 deg => 9µs.
(d'apres le site fribotte)
 
Je précise que je connais le C mais que je ne l'ai quasiment pas appliqué aux microcontroleurs...
 
Je pensais mettre les entrées sur le port A et la sortie sur un des bits du port B.
 
voici le code dont je dispose :

Code :
  1. #include <system.h>
  2. //Target PIC16F84 configuration word
  3. #pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _HS_OSC & _CP_OFF
  4. //Set clock frequency
  5. #pragma CLOCK_FREQ 4000000
  6. void interrupt( void )
  7. {
  8. //Handle timer0 interrupt
  9. if( intcon & (1<<T0IF) )
  10. {
  11.  clear_bit( intcon, T0IF ); //clear timer 0 interrupt bit
  12. }
  13. }
  14. void main( void )
  15. {
  16. //configuration du port A en entrée
  17. trisa = 00011111b;
  18. porta = 0x00;
  19. //configuration du port B en sortie
  20. trisb = 00000000b;
  21. portb = 0x00;
  22. //Set Timer0 mode
  23. clear_bit( option_reg, T0CS ); //configure timer0 as a timer
  24. //Set prescaler assignment
  25. clear_bit( option_reg, PSA ); //prescaler is assigned to timer0
  26. //Set prescaler rate
  27. clear_bit( option_reg, PS2 ); //prescaler rate 1:2
  28. clear_bit( option_reg, PS1 );
  29. clear_bit( option_reg, PS0 );
  30. //Set timer0 source edge selection
  31. set_bit( option_reg, T0SE ); //increment on high-to-low transition on RA4/T0CKI pin
  32. //Enable interrupts (Timer0)
  33. intcon = 0xA0;
  34. //Endless loop
  35. while( 1 )
  36. {
  37. }
  38. }


Message édité par force-pc le 07-06-2007 à 13:52:44

---------------
force-pc ===>> Graveuse numérique 99,9%
mood
Google
Posté le 07-06-2007 à 13:51:33  profilanswer
 

n°7414
RISC
Posté le 14-06-2007 à 22:14:31  profilanswer
 

Salut,
 
Je ne vois aucune initialisation des interruptions dans le main....
 
Je te conseille de lire le cours sur les  PICs du célèbre Bigonoff pour mieux comprendre les différentes unités du microcontrôleur et savoir comment les initialiser :
 
http://www.abcelectronique.com/big [...] ?par=33175
 
a+

n°7415
nicodache
marmotte en chocolat concept ©
Posté le 14-06-2007 à 22:29:46  profilanswer
 

vu ton pseudo, c'est pas un conseil à négliger [:dslam]


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°7416
force-pc
Pas de zap :(
Posté le 14-06-2007 à 22:50:04  profilanswer
 

Salut,
 
merci pour la réponse : voila ce que j'ai fait :  
 
les entrees sont sur le port B4 à B7 (interuptions)
la sortie est sur le port A bit 1.
 

Code :
  1. #include <system.h>
  2. #pragma CLOCK_FREQ 4000000
  3. //Configuration de données
  4. #pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _HS_OSC & _CP_OFF
  5. //Prototypes
  6. void interrupt(void);
  7. void generer_pwm(int, int);
  8. void main(void);
  9. void interrupt(void)
  10. {
  11. int pause;
  12. int pause2;
  13. int entree;
  14. int temp = 0;    //variable pour le calcul du duty cycle (PWM)
  15. //Entrée : PORT B -> entree
  16. entree = portb;
  17. entree = entree >> 4;  //decallage de 4 bits vers la gauche
  18. if(entree >= 8)
  19. {
  20.  //Le servomoteur tourne vers la droite
  21.  //Paramètres de la PWM
  22.  temp = entree - 8;
  23.  pause = 1440 + temp * 90; //valeur des pauses en µs, elles varient de 810µs à 1440µs
  24.  pause2 = 20000 - pause;
  25. }
  26. else
  27. {
  28.  //Le servomoteur tourne vers la gauche
  29.  //Paramètres de la PWM
  30.  temp = 7 - entree;
  31.  pause = 1440 - temp * 90; //valeur des pauses en µs, elles varient de 1440µs à 2070µs
  32.  pause2 = 20000 - pause;
  33. }
  34. //lancement de la PWM
  35. generer_pwm(pause, pause2);
  36. }
  37. void generer_pwm(int pause, int pause2)
  38. {
  39. //Sortie : 1 -> B0
  40. porta.1=1;
  41. //Pause
  42. delay_10us(pause/10);
  43. //Sortie : 0 -> B0
  44. porta.1=0;
  45. //Pause
  46. delay_10us(pause2/10);
  47. }
  48. void main(void)
  49. {
  50. //configuration du port A en sortie
  51. trisa = 00000000b;
  52. porta = 0x00;
  53. //configuration du port B en entree
  54. trisb = 11111111b;
  55. portb = 0x00;
  56. //initialisation du timer
  57. option_reg = 11000111b;  //11000000 prédiviseur par 256
  58. //configuration des interuption
  59. intcon = 10001000b;   //autorisation d'interuption par changement des pattes RB4 à RB7
  60. while(1)
  61. {
  62.  //le programme ne continue que grace aux interuptions
  63. }
  64. }


 
edit : je prog sous sourceboost :): compilo : boostC


Message édité par force-pc le 14-06-2007 à 23:00:09

---------------
force-pc ===>> Graveuse numérique 99,9%
n°7429
force-pc
Pas de zap :(
Posté le 15-06-2007 à 22:58:18  profilanswer
 

J'ai pensé à une autre version plus simple : sans les interuptions

Code :
  1. #include <system.h>
  2. #pragma CLOCK_FREQ 4000000
  3. //Configuration de données
  4. #pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _HS_OSC & _CP_OFF
  5. //Prototypes
  6. void generer_pwm(int, int);
  7. void main(void);
  8. void generer_pwm(int pause, int pause2)
  9. {
  10. //Sortie : 1 -> B0
  11. porta.1=1;
  12. //Pause
  13. delay_10us(pause/10);
  14. //Sortie : 0 -> B0
  15. porta.1=0;
  16. //Pause
  17. delay_10us(pause2/10);
  18. }
  19. void main(void)
  20. {
  21. int pause;
  22. int pause2;
  23. int entree;
  24. int temp = 0;    //variable pour le calcul du duty cycle (PWM)
  25. //configuration du port A en sortie
  26. trisa = 00000000b;
  27. porta = 0x00;
  28. //configuration du port B en entree
  29. trisb = 11111111b;
  30. portb = 0x00;
  31. //initialisation du timer
  32. option_reg = 11000111b;  //11000000 prédiviseur par 256
  33. //configuration des interuption
  34. intcon = 10001000b;   //autorisation d'interuption par changement des pattes RB4 à RB7
  35. while(1)
  36. {
  37.  //Entrée : PORT B -> entree
  38.  entree = portb;
  39.  entree = entree >> 4;  //decallage de 4 bits vers la gauche
  40.  if(entree >= 8)
  41.  {
  42.   //Le servomoteur tourne vers la droite
  43.   //Paramètres de la PWM
  44.   temp = entree - 8;
  45.   pause = 1440 + temp * 90; //valeur des pauses en µs, elles varient de 1440µs à 2070µs
  46.   pause2 = 20000 - pause;
  47.  }
  48.  else
  49.  {
  50.   //Le servomoteur tourne vers la gauche
  51.   //Paramètres de la PWM
  52.   temp = 7 - entree;
  53.   pause = 1440 - temp * 90; //valeur des pauses en µs, elles varient de 810µs à 1440µs
  54.   pause2 = 20000 - pause;
  55.  }
  56.  //lancement de la PWM
  57.  generer_pwm(pause, pause2);
  58. }
  59. }


 
Quelle version est la mieux ?


Message édité par force-pc le 15-06-2007 à 22:59:07

---------------
force-pc ===>> Graveuse numérique 99,9%
n°7436
force-pc
Pas de zap :(
Posté le 17-06-2007 à 21:50:23  profilanswer
 

allez, il y a bien quelqu'un qui s'y connait en programmation de pics...


---------------
force-pc ===>> Graveuse numérique 99,9%
n°7437
xstephx
Sarah!
Posté le 17-06-2007 à 22:04:44  profilanswer
 

oui mais je les programme en asm pour commande des servo :D


---------------
* Rejoignez le groupe SOJ sur last.fm ! * Mes critiques de films *
n°7438
force-pc
Pas de zap :(
Posté le 17-06-2007 à 22:39:15  profilanswer
 

et au niveau de la structure su programme (algorithme) tu aurais fais quoi ?


---------------
force-pc ===>> Graveuse numérique 99,9%
n°7449
force-pc
Pas de zap :(
Posté le 21-06-2007 à 23:08:49  profilanswer
 

[:force-pc]


---------------
force-pc ===>> Graveuse numérique 99,9%
n°7464
Vince 007 ​-
Posté le 24-06-2007 à 16:29:02  profilanswer
 

Coder en C sur des Pic 16F c'est du gachit ! :/
 
Les compilos C pour 16F ne sont pas trés performant et le code finale prend beaucoup de place. Pour développer en C, vaut mieux parti sur du 18Fxxxx qui intégre un module PWM ! ;)
 
Les 16F sont conçus pour l'assembleur (jeu d'instruction réduit et simple).
 
Je te conseille de télécharger MPlab sur le site de Microchip, tu pourra utiliser le simulateur intégré.


---------------
Balade moto dans la région toulousaine.
Suivre la construction d'une maison
mood
Google
Posté le 24-06-2007 à 16:29:02  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  [PIC][C] Commande de servomoteur PWM 16F84

 

Hit Parade