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.  




No comments:

Post a Comment