Aller au contenu


Photo
- - - - -

Generer un PWM de 20khz sur un ATtiny25/45/85


  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 210 messages
  • Gender:Male
  • Location:Aquitaine,Gironde

Posté 14 août 2020 - 08:47

Hello, 

 

Le but de cette fréquence est de rendre inaudible le son du pwm dans les moteurs.La fréquence n'est pas choisis au hasard, c'est la fréquence max à partir de laquelle on n'entend plus le son et la fréquence max que je peut balancer dans mon pont en H est 25khz.

 

Pour cela, il faut changer la fréquence du timer/counter 1

Page 89 https://ww1.microchi...5_Datasheet.pdf

 

Les sources qui m'aide à faire le réglage :

https://www.electros...-using-arduino/

https://forum.arduin...?topic=174349.0

http://www.technoblogy.com/show?QVN

 

Pour avoir cette fréquence pwm de 20khz, il faut utilisé un mode asynchrone cadencé à 60Mhz, directement sélectionnable dans l'IDE Arduino. Ensuite il faut divisé cette fréquence par 16 comme indiqué dans le tableau de la datasheet page 88. J'ai fini par en déduire cette ligne "TCCR1=TCCR1 & 0b11110101 | 0x01; ". Cela dit, autant je peut comprendre la première partie (avant | ) autant l'autre...... Et ensuite il faut définir la valeur de OCR1C à 199 est là aucune idée de comment procédé. 

Peut être faut il changer 0x01 par 0xC7 (199 en hexa) ?

 

OCR1C gère OC1a (pb1) et OC1b (pb4) ( () = sortie )

 

C'est très compliqué pour moi, d'autant que tout est en anglais ! Et de plus, pour validé ou invalidé, je n'est que tinkercad, mais il ne semble pas prendre en compte la modification des registres...

 


 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#2 firened

firened

    Membre

  • Membres
  • 44 messages
  • Gender:Male

Posté 14 août 2020 - 08:57

thanks for the post Microrupteur.
let's see if we can figure that out.

i hope the Arduino IDE works similar to Atmel Studio as that's what was common before Arduino existed.
you write you can select the clock source for timer1 in the IDE? i included the clock setting anyway:

//the bits you already correctly selected:  
TCCR1 |= 0b11110101;  
//then for PB4:  
GTTCR |= 0b01110000;  
//and the counter TOP value:  
OCR1C = 199;  
//change to PLL clock source for timer1:  
PLLCSR |= 0b00000010; //enable pll  
PLLCSR |= 0b00000100; //switch clock
and then set your desired PWM value like this:
OCR1A = out1;  
OCR1B = out2;


#3 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 210 messages
  • Gender:Male
  • Location:Aquitaine,Gironde

Posté 14 août 2020 - 09:23

 

 

GTTCR |= 0b01110000;

Haaa, je me douter bien qu'il le fallait aussi pour définir la sortie PB4  ! j'avais noter "GTCCR =GTCCR & 0b1111010;"

Yes i can select : nothing, 32mhz and 64mhz.

 

Ok, thank you. I wouldn't have thought that to define OCR1C was so simple.


 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#4 firened

firened

    Membre

  • Membres
  • 44 messages
  • Gender:Male

Posté 14 août 2020 - 09:44

ok.
the GTTCR 0b10000000 bit is used for a different function, other than the timer.

also, check if the serial UART relies on timer0 or timer1. else you wont be able to communicate anymore. i don't think the ATtiny85 has a hardware UART..

#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 968 messages
  • Gender:Male
  • Location:Anglet

Posté 14 août 2020 - 10:56

 J'ai fini par en déduire cette ligne "TCCR1=TCCR1 & 0b11110101 | 0x01; ". Cela dit, autant je peut comprendre la première partie (avant | ) autant l'autre...... Et ensuite il faut définir la valeur de OCR1C à 199 est là aucune idée de comment procédé. 

Peut être faut il changer 0x01 par 0xC7 (199 en hexa) ?

 

 

 

 

TCCR1 = TCCR1 & 0b11110101 | 0x01 


il faut comprendre que c'est une opération logique booléenne bit à bit

 

TCCR1 = TCCR1 ET 0b11110101 OU 0x01    

avec ET et OU représentant des opérations logique bit à bit


avec 0x01 = 0b00000001    avec 0b permettant uniquement d'expliciter que le nombre est écrit au format " binaire " (plus facile pour voir le résultat d'opérations logiques booléenne )


 

Pour comprendre comment calculer la nouvelle valeur de TCCR1  après ce calcul prenons l'exemble où TCCR1 vaut 0b01111000

dans cet exemple 

TCCR1 ET 0b11110101  = 0b01111000 ET  0b11110101  =  0b01110000 

 

donc 

TCCR1 ET 0b11110101 OU 0b00000001  = 0b01110000  OU 0b00000001 =  0b01110001 

Du coup le résultat après opération est donc 

TCCR1 = 0b01110001  


Le but de calculer ainsi permet de modifier uniquement les bits qui nous intéresse dans le cas où TCCR1 est partiellement configuré et qu'on ne veut toucher que ce qu'on a besoin

Si tu sais en lisant la datasheet que tu as besoin que TRCCR1 = 0b01110001 et que tu n'a rien a faire des précédentes configurations tu peux te permettre d'écrire directement  : 

TRCCR1 = 0b01110001;


C'est en lisant la datasheet et en comprenant à quoi servent chacun des bits des différents registres que tu vas savoir à quel valeur tu as besoin de les mettre.

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#6 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 210 messages
  • Gender:Male
  • Location:Aquitaine,Gironde

Posté 20 août 2020 - 04:35

Testé et pas approuvé. Comme Firened me l'avait dit, on perd de la réponse. Avec un niveaux de pwm égale, à 20khz, le moteur tourne beaucoup beaucoup plus lentement.


 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#7 firened

firened

    Membre

  • Membres
  • 44 messages
  • Gender:Male

Posté 20 août 2020 - 05:00

ok. yeah that's what happened to me too. I'm not completely sure why that happens. either
- the motor driver takes a considerable time to switch state, called the turn-on delay time + rise time
- or maybe it's got something to do with motor inductance (though i don't believe that makes any impact)

thanks for testing and reporting back. glad the code was working.




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users