4
STM32 F4 (PWM,SPI and ADC Test Examples) letselectronic.blogspot.com /2016/01/stm32-f4-pwmspi-and-adc-test.html STM32 F4 (PWM,SPI and ADC Test Examples) 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. 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 1/4

STM32 F4 (PWM,SPI And ADC Test Examples)

Embed Size (px)

Citation preview

Page 1: STM32 F4 (PWM,SPI And ADC Test Examples)

STM32 F4 (PWM,SPI and ADC Test Examples) letselectronic.blogspot.com /2016/01/stm32-f4-pwmspi-and-adc-test.html

STM32 F4 (PWM,SPI and ADC Test Examples)

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 techniquecouramment utilisée pour synthétiser des signaux continus à l'aide de circuits à fonctionnement tout ou rien, ou plusgé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 peutobtenir en moyenne sur une certaine durée n'importe quelle valeur intermédiaire.Ce phénomène est fortement recommandé pour assurer la variation devitesse de moteur a courant continu, aujourd'hui je vais vous démontrercomment on peut générer un signal PWM déune STM32 et visualiser sonprésence sur des diodes LEDs.

Voici un exemple de comment on genere un signal PWM using Mikro Cfor 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

1/4

Page 2: STM32 F4 (PWM,SPI And ADC Test Examples)

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 }

2/4

Page 3: STM32 F4 (PWM,SPI And ADC Test Examples)

}}

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'occupetotalement de la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélectiondu destinataire se fait par une ligne dédiée entre le maître et l'esclave appelée chip select.

Voici un exemple de comment interfacer un afficheur LCD 2X16avec la carte STM232 en utilisant le Mikro c for ARM:

//Let's Electronic By Aymen Lachkhem// www.letselectronic.blogspot.com// LCD module connectionssbit 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 connectionsunsigned 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 toDigital Converter) ou plus simplement A/D, est un montage électronique dont la fonction est de traduire unegrandeur analogique en une valeur numérique(codée sur plusieurs bits), proportionnelle au rapport entre lagrandeur analogique d'entrée et la valeur maximale du signal.Le signal converti est le plus souvent une tension électrique.

3/4

Page 4: STM32 F4 (PWM,SPI And ADC Test Examples)

Voici un exemple de comment utiliser le protocole ADC avec la carteSTM232 en utilisant le Mikro c for ARM:

//Let's Electronic By Aymen Lachkhem// www.letselectronic.blogspot.comunsigned 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 surle potentiomètre et la écrire sur le comportement d'une diode LED.

4/4