Discovery Robot

Uit RobotMC.be
Ga naar: navigatie, zoeken

De sturing : Het DiscoveryVL bordje met een ARM processor

Dit low-cost bord is uitstekend geschikt als sturing van een differential drive robot :

De software : allemaal freeware

Als C-compiler kan je de GCC GNU-compiler voor ARM gebruiken (huidige versie 4.7.3). Als gratis IDE kan je daarna Coocox installeren. Met de laatste versie 1.7.1 had ik problemen, maar de versie 1.5.1 lukte het wel. Hierna moet je nog het path instellen naar de GNU ARM compiler. Daarnaast moet je ook nog de ST-Link utility installeren, hiermee kan je dan uiteindelijk verbinding maken met het Discovery bord.

Noodzakelijke functies voor een robot

De Systick

Als eerste en onmisbare functie voor vrijwel elke embedded applicatie is een interrupt die op vaste tijden wordt opgeroepen. In deze interrupt worden dan een aantal tellers opgehoogd die je dan in je hoofdprogramma kan afvragen. Op deze manier worden wachtijden of steeds weerkerende functies gerealiseerd. De STM32 heeft hiervoor een aparte timer voorzien : de "systick". Deze timer kan geladen worden met een 24-bits waarde. Bij elke klokcyclus (of klokcyclus/8) telt deze waarde af en als de 0 wordt bereikt wordt de interupt doorlopen. In je programma moet je dus eerst deze waarde laden, en een interrupt routine voorzien met de juiste benaming :

/* Systick timer-----------------------------------------------------------*/
/* Setup SysTick Timer for 1 msec interrupts  */
 if (SysTick_Config(SystemFrequency / 1000))
 { 
   while (1);/* Capture error */ 
 }

Ik maak hier gebruik van de Standardlib van STM. De variabele SystemFrequency heeft de waarde van 24 MHz. Als we dit delen door 1000 krijgen we het getal 24000. Bij elke kloktick wordt deze waarde met 1 verlaagd, dus na exact 1ms is de waarde 0 bereikt en wordt de interrupt opgeroepen + er wordt opnieuw 24000 in het register geladen. De while(1) dient er alleen voor als de initialisatie niet lukt : deze funtie "Systick_Config()"moet normaal de waarde 0 teruggeven als er geen fout is opgetreden (een veel gebruikte methode in deze lib om fouten te detecteren). Als er een andere waarde wordt teruggegeven kom je in de eindeloze lus while(1) terecht : het programma hangt. Nu moet je ook nog de "interrupt handler" programmeren :

/**
 * @brief  This function handles SysTick Handler. The handler is called every 1ms
 * @param  None
 * @retval None
 */
void SysTick_Handler(void)
{
if (Delay != 0x00) Delay--;
print_timer++;bmp_timer++;L3G_timer++;HMC_timer++;ADXL_timer++;
stopwatch0++;stopwatch1++; stopwatch2++; stopwatch3++;
 // Speed measurement timer
 if(speed_timer++ >49 ) {		
  motor_control = true;
  moveAtSpeed_control = true; 
  speed_timer = 0;       
  }
}

Opgelet, al de variabelen die zowel in een interrupt als daarbuiten worden gebruikt moeten gedeclareerd worden als "volatile". Dit vertelt de compiler dat de variabele 'op de achtergrond' kan veranderen (door hardware of door een interrupt routine) en dat hij dus geen kopie van de betreffende variabele (bijvoorbeeld in een register) mag gebruiken. Ook zal de compiler "volatile" variabelen niet weg-optimaliseren. In de STM32 lib wordt volatile ook geschreven als __IO.