Showing posts with label STM32F4. Show all posts
Showing posts with label STM32F4. Show all posts

Monday, January 18, 2016

Play Audio Sound Using STM32

Bonjour, Aujourd'hui comme il est indiqu� au titre de cet article je vais essayer de produire une strophe musicale en utilisant la carte STM 32 F4 et un buzzer ou un speaker.





Commen�ons par d�finir le son :
Le son, c�est avant tout une vibration. Il faut que quelque chose bouge pour qu�un son soit produit. Par exemple, tu peux sonner une cloche, taper des mains ou pincer les cordes d�une guitare pour produire des vibrations qui vont g�n�rer des ondes sonores. Les vibrations voyagent d�un endroit � l�autre dans l�air sous forme d�ondes sonores.

Si les vibrations atteignent ton oreille, celle-ci va envoyer un signal � ton cerveau et tu vas entendre le son.
R�sultat de recherche d'images pour "notes musique png"




Mais si vous adore le physique vous pouvez lire ce que j'ai trouvez dans un article tr�s int�ressent sur le son au dessous sinon vous passer directement au test avec l'STM32




   
un son est une vibration de l'air. On peut en faire une repr�sentation graphique avec en abscisse le temps et en ordonn�e l'amplitude de la vibration : une onde plus grande aura un volume plus �lev�, une courbe "tass�e" en largeur repr�sente un son aigu. Car c'est la fr�quence de la vibration qui d�terminera la hauteur de la tonalit�. L'unit� de mesure des fr�quences est le hertz : 1 hertz correspond � une oscillation par seconde. Comme on le verra, nombre de param�tres concernant le son se mesurent en hertz, mais ne s'appliquent pas aux m�mes choses. Le la du diapason (ou de la tonalit� du t�l�phone) a une fr�quence de 440 Hz (la fr�quence des notes de musique suit une augmentation logarithmique, le doublement d'une fr�quence passe la note � l'octave sup�rieure). Bien que l'acuit� auditive varie d'une personne � l'autre, il est g�n�ralement admis que l'oreille humaine est capable de percevoir des fr�quences comprises entre 20 Hz et 20.000 Hz, avec une perte dans les aigus � mesure que l'on vieillit.

Une vid�o d'un haut parleur diffuse une fr�quence de 120 Hz dont les vibrations font danser ce liquide non-newtonien



Alors on peut conclure que le son en faite �lectroniquement est une combinaison entre un fr�quence et son delay d'ou on va se baser a cr�er notre programme suivant.
R�sultat de recherche d'images pour "stm32f4"   R�sultat de recherche d'images pour "buzzer"                     R�sultat de recherche d'images pour "stm32f4"      R�sultat de recherche d'images pour "buzzer"
J'ai bas�e sur Mikro c for ARM comme toujours, pour le brochage y a rien de sp�cial vous pouvez m�me comprendre ce qu'il faut faire par les commentaires �quip�es sur le programme,
 Alors si vous avez un buzeur ou un petit speaker apporter le et relier sa borne positive au PIN PE14 d'STM 32 et sa masse au masse d'STM32 et compiler ce programme au dessous et vous voyez la r�sultat.

      



  


Programme 
// Let's Electronic by Aymen Lachkhem
// How to play Audio Sound with STM32 F4
//www.letselectronic.blogspot.com



void Tone1() {
Sound_Play(659, 250); // Frequency = 659Hz, duration = 250ms
}

void Tone2() {
Sound_Play(698, 250); // Frequency = 698Hz, duration = 250ms
}

void Tone3() {
Sound_Play(784, 250); // Frequency = 784Hz, duration = 250ms
}

void Melody() { // Plays the melody from tones 1,2 and 3
Tone1();
Tone2();
Tone3();
Tone3();
Tone1();
Tone2();
Tone3();
Tone3();
Tone1();
Tone2();
Tone3();
Tone1();
Tone2();
Tone3();
Tone3();
Tone1();
Tone2();
Tone3();
Tone3();
Tone3();
Tone2();
Tone2();
Tone1();
}

void main() {

Sound_Init(&GPIOE_ODR, 14); // the sound output PE14
Sound_Play(880, 1000); // Play sound at 880Hz for 1 second

Melody(); //play the Melody that's we maked using Tones;

while (1) { } // Do Nothing

}


    Voici une d�monstration vid�o de fonctionnement :




   Have Fun :)

Sunday, January 17, 2016

Interfacing Servo-Motor With STM32


Interfacing Servo-Motor With STM32



Bonjour, Aujourd'hui on va discuter le fonctionnent du servo moteur en essayant de le contr�ler avec un STM32F4, contr�ler veut dire contr�ler quelle angle il la tourne vers. donc Commen�ons par une petite d�finition d'un servomoteur.

Un servomoteur est un syst�me motoris� capable d'atteindre des positions pr�d�termin�es, puis de les maintenir. La position est : dans le cas d�un moteur rotatif, une valeur d'angle et, dans le cas d�un moteur lin�aire une distance. On utilise des moteurs �lectriques (continu, asynchrone, brushless) aussi bien que des moteurs hydrauliques. Le d�marrage et la conservation de la position pr�d�termin�e sont command�s par un syst�me de r�glage.     

Mais savez vous que la commande de servo-moteur est pas totalement comme le moteur dc genre on l'alimente alors il tourne ? savez vous que chaque servo-moteur a sa propre m�thode de commande et de fonctionnement ?
On peut tout �tre d'accord que chaque servo moteur il fonctionne avec un signal PWM pulse with modulation que j'ai d�j� d�finit sur cet article PWM. Mais il faut bien comprendre que chaque servo a sa propre fa�on de commande qu'on peut seulement la comprendre sur son fichier technique.

Alors pour comprendre le fonctionnement de chaque un, on qu'aller a sa fichier technique et lire exactement le pulse associer a chaque angle par rapport au p�riode cyclique qu'il a chaque un . citons cette exemple 

les servomoteurs sont commander par les envoyer des pulsations. Ici le servo doit recevoir chaque 20 ms une pulsation ou le longueur de cette derni�re va indiquer a quelle angle exactement il doit tourner notre servomoteur. 

Voila cette exemple:
  • si a chaque 20 ms j'envoi une pulsation de longueur 1 ms le servo va tourner vers 0 degr� 
  • si a chaque 20 ms j'envoi une pulsation de 1.5 ms le servo va tourner pr�cis�ment vers 90 degr�
  • ......


D'ici on peut conclure la m�thode de la quelle le servo on doit le commander avec notre microcontr�leur, une seule sortie num�rique est capable de le commander si je la met on niveau haut pendant la p�riode ou pulsation est active et je la met en niveau bas pendant le reste de la p�riode (20ms - pulsation).

Aujourd'hui je vais commander ce servomoteur via une carte STM32 F4
R�sultat de recherche d'images pour "servomoteurs"
on se r�f�rant de sa fichier technique j'ai �cris le programme suivant:




//Let's electronic By Aymen Lachkhem
// Interfacing Servo-motor to STM32
// Letselectronic.blogspot.com
void servoRotate0() //0 Degree
{
unsigned int i;
for(i=0;i<50;i++)
{
gpiob_odr.f3 = 1;
Delay_us(1000);
gpiob_odr.f3 = 0;
Delay_us(19000);
}
}
void servoRotate90() //90 Degree
{
unsigned int i;
for(i=0;i<50;i++)
{
gpiob_odr.f3 = 1;
Delay_us(2500);
gpiob_odr.f3 = 0;
Delay_us(17500);
}
}
void servoRotate180() //180 Degree
{
unsigned int i;
for(i=0;i<50;i++)
{
gpiob_odr.f3 = 1;
Delay_us(4400);
gpiob_odr.f3 = 0;
Delay_us(16000);
}
}
void main(){


GPIO_Digital_Output(&GPIOB_ODR, _GPIO_PINMASK_3); // configuration of pb3 as Digital Output
GPIO_Digital_Input (&GPIOA_BASE, _GPIO_PINMASK_3 | _GPIO_PINMASK_4 | _GPIO_PINMASK_5); // configure PORTA pins as speed control input
while (1) {
if (GPIOA_IDR.B3) {
servoRotate0(); //0 Degree
Delay_ms(2000);}
if (GPIOA_IDR.B4) {
servoRotate90(); //90 Degree
Delay_ms(2000);}
if (GPIOA_IDR.B5) {
servoRotate180(); //180 Degree
Delay_ms(2000);}
}
}


Il est tout indiquer au commentaire de programme a propos la configuration, le principe est totalement simple ou j'aurai 3 entr�es num�riques que je vais utiliser comme des boutons poussoires qui vont forcer le servo moteur relier au  sortie num�rique a tourn�e vers une angle bien pr�cise comme il est citer au vid�o au dessous 


Une d�monstration vid�o qui r�sume tout le travail fait.



   




Saturday, January 16, 2016

Speed Motor's Variator Using STM32

Speed Motor's Variator Using STM32


R�sultat de recherche d'images pour "stm32 motor"


La variation de vitesse de moteur a courant continu dans cet article est bas�e sur le protocole PWM qu'on peut le d�finir comme ceci :


PWM

La modulation de largeur d'impulsions (MLI ; en anglais : Pulse Width Modulation, soit PWM), est une technique couramment utilis�e pour synth�tiser des signaux continus � l'aide de circuits � fonctionnement tout ou rien, ou plus g�n�ralement � �tats discrets.
Le principe g�n�ral est qu'en appliquant une succession d'�tats discrets pendant des dur�es bien choisies, on peut obtenir en moyenne sur une certaine dur�e n'importe quelle valeur interm�diaire.
R�sultat de recherche d'images pour "pwm mli definition"
Ce ph�nom�ne est fortement recommand� pour assurer la variation de vitesse de moteur a courant continu, aujourd'hui je vais vous d�montrer comment on peut g�n�rer un signal PWM d�une STM32 et visualiser son pr�sence sur des diodes LEDs.

Voici un exemple de comment on genere un signal PWM using Mikro C for ARM et STM32F4:
//Let's Electronic By Aymen Lachkhem
// www.letselectronic.blogspot.com
// Hello in this tutoriel we are going to use 4 buttons (digital Input), the first two will increase and decrease the current duty for the
// first Led and the second two will make the same thing with the other Led.
unsigned int current_duty, old_duty, current_duty1, old_duty1;
unsigned int pwm_period1, pwm_period2;

void InitMain() {
GPIO_Digital_Input (&GPIOA_BASE, _GPIO_PINMASK_3 | _GPIO_PINMASK_4 | _GPIO_PINMASK_5 | _GPIO_PINMASK_6); // configure PORTA pins as input
}

void main() {
InitMain();
current_duty = 100; // initial value for current_duty
current_duty1 = 100; // initial value for current_duty1

pwm_period1 = PWM_TIM1_Init(5000);
pwm_period2 = PWM_TIM4_Init(5000);

PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // Set current duty for PWM_TIM1
PWM_TIM4_Set_Duty(current_duty1, _PWM_NON_INVERTED, _PWM_CHANNEL2); // Set current duty for PWM_TIM4

PWM_TIM1_Start(_PWM_CHANNEL1, &_GPIO_MODULE_TIM1_CH1_PE9);

PWM_TIM4_Start(_PWM_CHANNEL2, &_GPIO_MODULE_TIM4_CH2_PD13);

while (1) { // endless loop
if (GPIOA_IDR.B3) { // button on RA3 pressed
Delay_ms(1);
current_duty = current_duty + 5; // increment current_duty
if (current_duty > pwm_period1) { // if we increase current_duty greater then possible pwm_period1 value
current_duty = 0; // reset current_duty value to zero
}
PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // set newly acquired duty ratio
}

if (GPIOA_IDR.B4) { // button on RA4 pressed
Delay_ms(1);
current_duty = current_duty - 5; // decrement current_duty
if (current_duty > pwm_period1) { // if we decrease current_duty greater then possible pwm_period1 value (overflow)
current_duty = pwm_period1; // set current_duty to max possible value
}
PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // set newly acquired duty ratio
}

if (GPIOA_IDR.B5) { // button on RA5 pressed
Delay_ms(1);
current_duty1 = current_duty1 + 5; // increment current_duty
if (current_duty1 > pwm_period2) { // if we increase current_duty1 greater then possible pwm_period2 value
current_duty1 = 0; // reset current_duty1 value to zero
}
PWM_TIM4_Set_Duty(current_duty1, _PWM_NON_INVERTED, _PWM_CHANNEL2); // set newly acquired duty ratio
}

if (GPIOA_IDR.B6) { // button on RA6 pressed
Delay_ms(1);
current_duty1 = current_duty1 - 5; // decrement current_duty
if (current_duty1 > pwm_period2) { // if we decrease current_duty1 greater then possible pwm_period1 value (overflow)
current_duty1 = pwm_period2; // set current_duty to max possible value
}
PWM_TIM4_Set_Duty(current_duty1, _PWM_NON_INVERTED, _PWM_CHANNEL2);
}

Delay_ms(1); // slow down change pace a little
}
}
    Voici une d�monstration vid�o de fonctionnement :




L�objectif de ce tutoriel est de mettre en oeuvre le contr�le de vitesse de moteur a courant continu de fa�on autonome 
Pour ceci on aura besoin de 
Un Moteur DC
STM32 F4
Transistor TIP122
Diode
Deux boutons poussoirs 
deux r�sistances 1 K

Le principe est tout � fait simple on aura deux boutons poussoirs ou la premi�re va incr�menter la vitesse de moteur et la deuxi�me va faire exactement le contraire.

L�incr�mentation continuera jusqu�� alimenter le moteur en r�gime de rapport cyclique complet puis conditionnement une autre incr�mentation va le remettre a 0 tour/s, le m�me truc se passe avec la d�cr�mentation de rapport d�ja nul va le rendre on vitesse maximale.


Voici un exemple de comment on varie le vitesse de moteur a courant continu using Mikro C for ARM et STM32F4:

//Let's Electronic By Aymen Lachkhem
//
www.letselectronic.blogspot.com
// In This Tutorial We are going to control the speed of dc motor using Stm32 PWM.
unsigned int current_duty, old_duty;
unsigned int pwm_period1, pwm_period2;

void InitMain() {
GPIO_Digital_Input (&GPIOA_BASE, _GPIO_PINMASK_3 | _GPIO_PINMASK_4 ); // configure PORTA pins as speed control input
}

void main() {
InitMain();
current_duty = 100; // initial value for current_duty


pwm_period1 = PWM_TIM1_Init(5000);


PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // Set current duty for PWM_TIM1

PWM_TIM1_Start(_PWM_CHANNEL1, &_GPIO_MODULE_TIM1_CH1_PE9);



while (1) { // endless loop
if (GPIOA_IDR.B3) { // button on RA3 pressed
Delay_ms(1);
current_duty = current_duty + 1; // increment speed
if (current_duty > pwm_period1) { // if we increase current_duty greater then possible pwm_period1 value
current_duty = 0; // reset current_duty value to zero
}
PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // set newly acquired duty ratio
}

if (GPIOA_IDR.B4) { // button on RA4 pressed
Delay_ms(1);
current_duty = current_duty - 3; // decrement speed
if (current_duty > pwm_period1) { // if we decrease current_duty greater then possible pwm_period1 value (overflow)
current_duty = pwm_period1; // set current_duty to max possible value
}
PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // set newly acquired duty ratio
}

Delay_ms(1); // slow down change pace a little
}
}
    Voici une d�monstration vid�o de fonctionnement :




   




Friday, January 15, 2016

STM32 F4 (PWM,SPI and ADC Test Examples)

STM32 F4 (PWM,SPI and ADC Test Examples)


R�sultat de recherche d'images pour "stm32"


On Commence par definir ces 3 grandes protocoles �lectroniques :

PWM

La modulation de largeur d'impulsions (MLI ; en anglais : Pulse Width Modulation, soit PWM), est une technique couramment utilis�e pour synth�tiser des signaux continus � l'aide de circuits � fonctionnement tout ou rien, ou plus g�n�ralement � �tats discrets.
Le principe g�n�ral est qu'en appliquant une succession d'�tats discrets pendant des dur�es bien choisies, on peut obtenir en moyenne sur une certaine dur�e n'importe quelle valeur interm�diaire.
R�sultat de recherche d'images pour "pwm mli definition"
Ce ph�nom�ne est fortement recommand� pour assurer la variation de vitesse de moteur a courant continu, aujourd'hui je vais vous d�montrer comment on peut g�n�rer un signal PWM d�une STM32 et visualiser son pr�sence sur des diodes LEDs.

Voici un exemple de comment on genere un signal PWM using Mikro C for ARM et STM32F4:
//Let's Electronic By Aymen Lachkhem
// www.letselectronic.blogspot.com
// Hello in this tutoriel we are going to use 4 buttons (digital Input), the first two will increase and decrease the current duty for the
// first Led and the second two will make the same thing with the other Led.
unsigned int current_duty, old_duty, current_duty1, old_duty1;
unsigned int pwm_period1, pwm_period2;

void InitMain() {
GPIO_Digital_Input (&GPIOA_BASE, _GPIO_PINMASK_3 | _GPIO_PINMASK_4 | _GPIO_PINMASK_5 | _GPIO_PINMASK_6); // configure PORTA pins as input
}

void main() {
InitMain();
current_duty = 100; // initial value for current_duty
current_duty1 = 100; // initial value for current_duty1

pwm_period1 = PWM_TIM1_Init(5000);
pwm_period2 = PWM_TIM4_Init(5000);

PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // Set current duty for PWM_TIM1
PWM_TIM4_Set_Duty(current_duty1, _PWM_NON_INVERTED, _PWM_CHANNEL2); // Set current duty for PWM_TIM4

PWM_TIM1_Start(_PWM_CHANNEL1, &_GPIO_MODULE_TIM1_CH1_PE9);

PWM_TIM4_Start(_PWM_CHANNEL2, &_GPIO_MODULE_TIM4_CH2_PD13);

while (1) { // endless loop
if (GPIOA_IDR.B3) { // button on RA3 pressed
Delay_ms(1);
current_duty = current_duty + 5; // increment current_duty
if (current_duty > pwm_period1) { // if we increase current_duty greater then possible pwm_period1 value
current_duty = 0; // reset current_duty value to zero
}
PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // set newly acquired duty ratio
}

if (GPIOA_IDR.B4) { // button on RA4 pressed
Delay_ms(1);
current_duty = current_duty - 5; // decrement current_duty
if (current_duty > pwm_period1) { // if we decrease current_duty greater then possible pwm_period1 value (overflow)
current_duty = pwm_period1; // set current_duty to max possible value
}
PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // set newly acquired duty ratio
}

if (GPIOA_IDR.B5) { // button on RA5 pressed
Delay_ms(1);
current_duty1 = current_duty1 + 5; // increment current_duty
if (current_duty1 > pwm_period2) { // if we increase current_duty1 greater then possible pwm_period2 value
current_duty1 = 0; // reset current_duty1 value to zero
}
PWM_TIM4_Set_Duty(current_duty1, _PWM_NON_INVERTED, _PWM_CHANNEL2); // set newly acquired duty ratio
}

if (GPIOA_IDR.B6) { // button on RA6 pressed
Delay_ms(1);
current_duty1 = current_duty1 - 5; // decrement current_duty
if (current_duty1 > pwm_period2) { // if we decrease current_duty1 greater then possible pwm_period1 value (overflow)
current_duty1 = pwm_period2; // set current_duty to max possible value
}
PWM_TIM4_Set_Duty(current_duty1, _PWM_NON_INVERTED, _PWM_CHANNEL2);
}

Delay_ms(1); // slow down change pace a little
}
}
    Voici une d�monstration vid�o de fonctionnement :




SPI

Une liaison SPI (pour Serial Peripheral Interface) est un bus de donn�es s�rie synchrone baptis� ainsi par Motorola, qui op�re en mode Full-duplex. Les circuits communiquent selon un sch�ma ma�tre-esclaves, o� le ma�tre s'occupe totalement de la communication. Plusieurs esclaves peuvent coexister sur un m�me bus, dans ce cas, la s�lection du destinataire se fait par une ligne d�di�e entre le ma�tre et l'esclave appel�e chip select.

R�sultat de recherche d'images pour "spi protocol"

Voici un exemple de comment interfacer un afficheur LCD 2X16 avec la carte STM232 en utilisant le Mikro c for ARM:
//Let's Electronic By Aymen Lachkhem
// www.letselectronic.blogspot.com

// LCD module connections
sbit LCD_RS at GPIOB_ODR.B2;
sbit LCD_EN at GPIOB_ODR.B3;
sbit LCD_D4 at GPIOB_ODR.B4;
sbit LCD_D5 at GPIOB_ODR.B5;
sbit LCD_D6 at GPIOB_ODR.B6;
sbit LCD_D7 at GPIOB_ODR.B7;
// End LCD module connections

unsigned int adc_value;


void main(){


Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

while(1) {
Lcd_Out(1, 3, "STM32 With LCD");
delay_ms(10);
}
}
    Voici une d�monstration vid�o de fonctionnement :


Convertisseur Analogique Num�rique ADC

Un convertisseur analogique-num�rique (CAN, parfois convertisseur A/N), ou en anglais ADC pour (Analog to Digital Converter) ou plus simplement A/D, est un montage �lectronique dont la fonction est de traduire une grandeur analogique en une valeur num�rique(cod�e sur plusieurs bits), proportionnelle au rapport entre la grandeur analogique d'entr�e et la valeur maximale du signal.
Le signal converti est le plus souvent une tension �lectrique.
R�sultat de recherche d'images pour "convertisseur analogique num�rique"



Voici un exemple de comment utiliser le protocole ADC avec la carte STM232 en utilisant le Mikro c for ARM:
//Let's Electronic By Aymen Lachkhem
// www.letselectronic.blogspot.com

unsigned int adc_value;


void main(){

adc_value = ADC1_Read(3); // read analog value from ADC1 module channel 3


while(1) {
GPIOC_BASE = adc_value;
delay_ms(10);
}
}
 Voici une d�monstration vid�o de fonctionnement pr�c�dant juste ici on va lire la valeur analogique sur le potentiom�tre et la �crire sur le comportement d'une diode LED.