Showing posts with label Motor. Show all posts
Showing posts with label Motor. Show all posts

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.