Difference between revisions of "Program IntroARM"

From Chalmers Robotförening
 
(37 intermediate revisions by the same user not shown)
Line 1: Line 1:
Denna sida innehåller information om programmet för IntroARM. Här finns dokumentation för de specialskrivna biblioteksfunktioner som finns för IntroARM (t.ex. styra LEDs, Motorer, läsa sensorer etc). För mer allmän information om programmering av STM32, kolla på sidan [[Programmering STM32]].
Denna sida innehåller information om programmet för [[IntroARM]]. Här finns dokumentation för de specialskrivna biblioteksfunktioner som finns för IntroARM (t.ex. styra LEDs, Motorer, läsa sensorer etc). För mer allmän information om programmering av STM32, kolla på sidan [[Programmering STM32]].


=Programmet=
=Programmet=
Olika varianter av programmet hittar du här. Dessa är till för v2:<br>
 
'''Programmet har numera flyttat till Github: https://github.com/ChalmersRobotics/IntroARM. Där finns den senaste revisionen av koden.''' Varianterna nedan finns för dokumentation.
 
Olika varianter av programmet hittar du här. Dessa är till för v2 '''(alltså gamla)''':<br>
[[File:IntroARM_kod.zip]]<br>
[[File:IntroARM_kod.zip]]<br>
Denna kod innehåller endast de specifika .c- och .h-filer som IntroARM använder sig av. Zip-filen innehåller ett startup-script (.S-filen) som behövs. Programmet bygger på STs standard-bibliotek som inte följer med, men som kan hittas via STs hemsida (Todo: Lägg till en länk där man hittar det). Det finns inte heller med ett länkarscript, som också behövs.
Denna kod innehåller endast de specifika .c- och .h-filer som IntroARM använder sig av. Zip-filen innehåller ett startup-script (.S-filen) som behövs. Programmet bygger på STs standard-bibliotek som inte följer med, men som kan hittas via STs hemsida (Todo: Lägg till en länk där man hittar det). Det finns inte heller med ett länkarscript, som också behövs.
Line 13: Line 16:


==Parameterstyrning==
==Parameterstyrning==
Till v3 lades en funktion till för att enkelt kunna styra vilken hårdvara programmet är skrivet för. Detta anges med hjälp av parametern HARDVARE_REV filen hardwareVersion.h. Denna sätts till det numret på hårdvarurevision som ska användas (2 eller 3 finns det stöd för just nu)
Till v3 lades en funktion till för att enkelt kunna styra vilken hårdvara programmet är skrivet för. Detta anges med hjälp av parametern HARDVARE_REV filen hardwareRev.h. Denna sätts till det numret på hårdvarurevision som ska användas (2 eller 3 finns det stöd för just nu)


=Generell info=
=Generell info=
Målet är att programmet ska vara uppdelat i moduler, d.v.s. att man ska kunna välja att endast använda vissa delar av programmet oberoende av andra delar. Man väljer vilken modul man ska använda genom att inkludera filen och köra init-funktionen för den.
Målet är att programmet ska vara uppdelat i moduler, d.v.s. att man ska kunna välja att endast använda vissa delar av programmet oberoende av andra delar. Man väljer vilken modul man ska använda genom att inkludera filen (h-filen) för modulen och köra init-funktionen för den.


==Port-karta==
==Port-karta==
Nedan följer en beskrivning på vilka portar som är kopplade till vilka funktioner på IntroARM.
Nedan följer en beskrivning på vilka portar som är kopplade till vilka funktioner på IntroARM. Notera att "Namn i koden" endast är applicerbart för de portar som det finns en mening att komma åt direkt. För ytterligare funktioner, kolla i [http://www.st.com/web/en/resource/technical/document/datasheet/CD00251732.pdf databladet] för processorn.
{| class="wikitable"
|-
! align="center" |'''Port'''
! align="center" |'''Pin'''
! align="center" |'''Funktion'''
! align="center" |'''Namn i koden (om applicerbart)'''
|-
| PA0||10||Kantsensor höger (2)||ADCEdgeRight
|-
| PA1||11||Batterimätare||ADCBatteryLevel
|-
| PA2||12||Kantsensor vänster (1)||ADCEdgeLeft
|-
| PA3||13||IR-mottagare vänster (4)||IR_LEFT
|-
| PA4||14||DAC||
|-
| PA5||15||SPI1 SCK||
|-
| PA6||16||SPI1 MISO||
|-
| PA7||17||SPI1 MOSI||
|-
| PA8||29||Knapp 1||SW1
|-
| PA9||30||UART1_TX (BOOT_TX)||
|-
| PA10||31||UART1_RX (BOOT_RX)||
|-
| PA11||32||Motor höger PWM1||
|-
| PA12||33||IR-mottagare bak||SENSE_REMOTE
|-
| PA13||34||SWDIO (programmering)||
|-
| PA14||37||SWCLK (programmering)||
|-
| PA15||38||LED2||LED_2_XXX
|-
| PB0||18||Tachometer höger||ADCTachometerRight
|-
| PB1||19||Tachometer vänster||ADCTachometerLeft
|-
| PB2||20||LED3/Boot1||LED_3_XXX
|-
| PB3||39||LED1||LED_1_XXX
|-
| PB4||40||LED4||LED_4_XXX
|-
| PB5||41||Motor sleep||MOTOR_ENABLE/DISABLE
|-
| PB6||42||I2C1 SCL||
|-
| PB7||43||I2C1 SDA||
|-
| PB8||45||Buzzer||
|-
| PB9||46||IR-LEDs puls||
|-
| PB10||21||UART3_TX||
|-
| PB11||22||UART3_RX||
|-
| PB12||25||Knapp 2||SW2
|-
| PB13||26||Motor vänster PWM1||
|-
| PB14||27||Motor vänster PWM2||
|-
| PB15||28||Motor höger PWM2||
|-
| PC13||2||IR-mottagare höger||IR_RIGHT
|-
| PC14||3||IR-mottagare fram höger||IR_FR_RIGHT
|-
| PC15||4||IR-mottagare fram vänster||IR_FR_LEFT
|}


=Modulerna=
=Modulerna=
Nedan följer en beskrivning av varje modul. En del filer kan innehålla fler än en modul, vilket gör att dessa moduler är sammankopplade. Det finns också ett antal moduler som är mycket grundläggande för IntroARMs funktion. Dessa bör alltid användas, då många funktioner beror på dessa. Detta är dels standard-peripheral-biblioteket från ST samt time-modulen
Nedan följer en beskrivning av varje modul. En del filer kan innehålla fler än en modul, vilket gör att dessa moduler är sammankopplade. Det finns också ett antal moduler som är mycket grundläggande för IntroARMs funktion. Dessa bör alltid användas, då många funktioner beror på dessa. Detta är dels standard-peripheral-biblioteket från ST samt time-modulen.
<br>'''OBS: Det är inte säkert att alla modulerna finns till alla programversioner. Stöd läggs till lite slumpmässigt. De flesta funktioner bör finnas med i mjukvaran för V3.'''
 
 
==Exempel-modul==
Varje modul beskrivs med en inledande text med generell info om modulen.
* Filer: Anger vilka c- och h-filer som behövs för modulen.
* Resurser: Anger vilka hårdvaruresurser modulen använde, t.ex. pinnar, timers, DMA etc.
* Settings: Anger om det finns några inställningar som kan göras för modulen. Inställningarna är typiskt makros som finns i h-filerna. Detta kan vara t.ex. max-/minvärden etc.
* Funktioner/Variabler: Anger vilka funktioner som användaren kan använda sig av. Alla moduler har en init-funktion. Funktionerna kan vara saker som att ställa in inställningar i runtime, slå av och på funktioner eller utföra operationer (t.ex. köra motorer, eller blinka LEDs). En del moduler (typiskt sensor-moduler) använder sig av globala variabler som koms åt via h-filen.


==Time==
==Time==
Line 35: Line 124:
==syscalls/xprintf==
==syscalls/xprintf==
Används för att få en del standard-funktionalitet, såsom printf, till IntroARM. xprintf är en samling "lättare" varianter av standardfunktionerna, men stödjer inte flyttal. Med hjälp av dessa kommer meddelandet från printf/xprintf att skrivas ut på uart1 (den som är kopplad till bootloadern). Det är självklart möjligt att ändra på funktionen _write och få den att skriva ut på någon annan UART (eller t.o.m. någon annan buss).
Används för att få en del standard-funktionalitet, såsom printf, till IntroARM. xprintf är en samling "lättare" varianter av standardfunktionerna, men stödjer inte flyttal. Med hjälp av dessa kommer meddelandet från printf/xprintf att skrivas ut på uart1 (den som är kopplad till bootloadern). Det är självklart möjligt att ändra på funktionen _write och få den att skriva ut på någon annan UART (eller t.o.m. någon annan buss).
* Filer: syscalls.c, syscalls.h, xprintf.c, xprintf.h, uart.c, uart.h
* Filer: syscalls.c, syscalls.h, xprintf.c, xprintf.h, uart.c, uart.h, utils.c, utils.h
* Settings: Inga
* Settings: Inga
* Funktioner:
* Funktioner:
** [http://www.cplusplus.com/reference/cstdio/printf/ printf] - Standard C-funktion för att skriva ut formaterad text.
** [http://www.cplusplus.com/reference/cstdio/printf/ printf] - Standard C-funktion för att skriva ut formaterad text.
** [http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf] - Samma som printf, men skriver till en specad buffer i minnet.
** xprintf - Fungerar som vanliga printf, men är lite mer lättvikt och stödjer inte flyttal
** xprintf - Fungerar som vanliga printf, men är lite mer lättvikt och stödjer inte flyttal
** xsprintf - Fungerar som vanliga sprintf, men är lite mer lättvikt och stödjer inte flyttal
** xfprintf(uartPutcDMA,"sträng",...) - Som printf, men skickar hela strängen via DMA, för att inte blockera för mycket.
** char* ftostr(float, places) - Konverterar ett flyttal till en sträng (eftersom xprintf inte stödjer flyttal). Float är flyttalet som ska omvandlas och places är antalet decimaler. Funktionen returnerar en nullterminerad sträng. Typisk användning kan vara: xprintf("Temp: %s\n",ftostr(tempFloat,3));
** float xatof(char*) - Konverterar från en sträng till ett flyttal. Fungerar som standardfunktionen, men är lite lättare. Tar in en nullterminerad sträng (char*) och returernar en float. Blir någonting fel returneras värdet 0.


==LEDs==
==LEDs==
Line 64: Line 158:


==Motor==
==Motor==
Styr motorerna.
Styr motorerna. Kan styras dels med PWM och dels på hastighet via tachometrarna.
*Filer: mc.c och mc.h
*Filer: mc.c, mc.h, adc.c, adc.h
*Settings:
*Settings:
** MC_RIGHT_DIR och MC_LEFT_DIR ställer åt vilket håll som är "framåt" på motorerna. Dessa kan ställas till -1.0 eller 1.0 och ställs efter test av motorerna.
** MC_RIGHT_DIR och MC_LEFT_DIR ställer åt vilket håll som är "framåt" på motorerna. Dessa kan ställas till -1.0 eller 1.0 och ställs efter test av motorerna.
Line 80: Line 174:
** irInit() - Initierar portar, timers etc till IR-sensorerna
** irInit() - Initierar portar, timers etc till IR-sensorerna
** irEnable()/irDisable() - Slår på och av pulsningen av IR-LEDsen. Kan användas för att spara batteri, och skall användas i väntan på startmodul-signal
** irEnable()/irDisable() - Slår på och av pulsningen av IR-LEDsen. Kan användas för att spara batteri, och skall användas i väntan på startmodul-signal
** irSetFreq(unsigned short freq)/irSetSens(unsigned char sens) - Ställer in frekvensen (i Hz)/känsligheten för sensorerna genom att ändra pulsningsfrekvensen på LEDsen. irSetSens tar in ett värde mellan 0 och IR_SENS_MAX och anropar i sin tur irSetFreq.
** irSetFreq(unsigned short freq)/irSetSens(unsigned char sens) - Ställer in frekvensen (i Hz)/känsligheten för sensorerna genom att ändra pulsningsfrekvensen på LEDsen (mottagarna är olika känsliga för olika frekvenser). irSetSens tar in ett värde mellan 0 och IR_SENS_MAX och anropar i sin tur irSetFreq.
** IR_RIGHT, IR_FR_RIGHT, IR_FR_LEFT och IR_LEFT - innehåller det filtrerade värdet på hinderdetektorerna (Höger, höger fram, vänster fram, vänster). Är 1 om sensorn ser, 0 om den inte ser. Kopplade till variablerna irActive''n'', där ''n'' är 1-4 och motsvarar IRMOT1-4.
** IR_RIGHT, IR_FR_RIGHT, IR_FR_LEFT och IR_LEFT - innehåller det filtrerade värdet på hinderdetektorerna (Höger, höger fram, vänster fram, vänster). Är 1 om sensorn ser, 0 om den inte ser. Kopplade till variablerna irActive''n'', där ''n'' är 1-4 och motsvarar IRMOT1-4.


Line 129: Line 223:
</div>
</div>


==Fjärrkontrollavkodare==
==Fjärrkontrollavkodare (RC5)==
Tar emot och avkodar meddelanden från mottagaren bak på roboten. Stödjer endast RC5 i dagsläget.
Tar emot och avkodar meddelanden från mottagaren bak på roboten. Stödjer endast RC5 i dagsläget.
* Filer: ir.c, ir.h, rc5.c, rc5.h, time.c, time.h
* Filer: rc5.c, rc5.h
* Resurser som används:
** TIM6
** PA12 + dess interrupt
** systick-interrupt som går varje sekund.
* Settings:
* Settings:
** Makro för känslighet
** MAX_ERROR - Ställer hur mycket fel det maximalt får vara på timingen. Denna bör sättas till en delmängd av HALF_BIT_CNT.
* Funktioner:
* Funktioner:
** rc5Init() - initierar rc5-kommunikationen
** rc5Init() - initierar rc5-kommunikationen
** rc5SetCallbackFunction(fun) - ställer in vilken funktion som ska anropas när ett meddelande är mottaget. Funktionen måste ta in en pekare till typen RC5DATA, en struct som innehåller adress och kommando från RC5. Se till att callbackfunktionen inte är för lång, eftersom denna anropas från ett interrupt.
** rc5SetCallbackFunction(fun) - ställer in vilken funktion som ska anropas när ett meddelande är mottaget. Funktionen måste ta in en pekare till typen RC5DATA, en struct som innehåller adress och kommando från RC5. Se till att callbackfunktionen inte är för lång, eftersom denna anropas från ett interrupt.
** rc5Enable/Disable - Slår på/av RC5-funktionen (stänger av interruptet)
** rc5HasNext()/rc5GetNext(RC5DATA *data) - Kollar ifall det finns ny RC5-data samt hämtar nästa data i buffern. Notera att denna inte fungerar ifall callback-funktion används.


<div class="mw-collapsible mw-collapsed" style="width:600px">
<div class="mw-collapsible mw-collapsed" style="width:600px">
Line 142: Line 242:
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
<syntaxhighlight lang="c" enclose="pre">
<syntaxhighlight lang="c" enclose="pre">
void rc5Callback(*RC5DATA data);
void rc5Callback(RC5DATA *data);


void main ()
void main ()
{
{
irInit();
 
irDisable();
rc5SetCallbackFunction(rc5Callback);
rc5Init();
rc5Init();
rc5SetCallbackFunction(rc5Callback);
while(1)
{
//RUn main loop
}
 
}
}


void rc5Callback(*RC5DATA data)
void rc5Callback(RC5DATA *data)
{
{
unsigned char cmd = data->cmd;
if (data->address_low == RC5_ADR_TV1)
unsigned char adr = data->adr;
if (adr == RC5_ADR_TV && cmd == RC5_CMD_1)
{
{
startRobot();
switch(data->command)
}
{
else if (adr == RC5_ADR_TV && cmd == RC5_CMD_2)
case RC5_CMD_1:
{
startRobot()
stopRobot();
break;
case RC5_CMD_2: //Forward
stopRobot()
break;
 
}
}
}
}
}


</syntaxhighlight>
</syntaxhighlight>
Line 179: Line 287:
==Tachometrar==
==Tachometrar==
Sköter ADC och läser av tachometrar.
Sköter ADC och läser av tachometrar.
* Filer: adc.c, adc.h, (mc.c, mc.h (för annars skulle det inte hända så mycket))
* Filer: adc.c, adc.h, time.c, time.h, (mc.c, mc.h (för annars skulle det inte hända så mycket))
* Settings:
* Settings:
* Funktioner:
* Funktioner:


==Batterimätning==
==Batterimätning==
Sköter ADC och mäter batterispänningen. Ger ut ett värde mellan 0 och 4096. Varje LSB motsvarar ungefär 3.2mV på batteriet. För att beräkna en vilket ADC-värde en spänning motsvarar tar du helt enkelt (spänningen i mV)/3.2 (8.4V =2625 ADC)
Sköter ADC och mäter batterispänningen. Ger ut ett värde mellan 0 och 4096. Varje LSB motsvarar ungefär 3.2mV på batteriet. För att beräkna en vilket ADC-värde en spänning motsvarar tar du helt enkelt (spänningen i mV)/3.2 (8.4V = 2625 ADC) eller tvärtom: ADC=mV/3.2 och mV=ADC*3.2.
* Filer: adc.c, adc.h, main.c
* Settings:
* Funktioner:
** ADCBatteryLevel - Ger råvärdet på batterispänningen
** ADCBattmV - Ger batterispänningen i mV
** showBattery() - Visar batteristatus på LEDs. Väntar i 1100ms totalt.
 
==Temperaturmätning==
Microcontrollern har en inbyggd temperatursensor. Denna finns mappad mot ADCn.
* Filer: adc.c och adc.h
* Filer: adc.c och adc.h
* Settings:
* Settings:
* Funktioner:
* Funktioner:
** ADCTempRaw - Ger rådatan från termometern
** ADCTempDegC - Ger temperaturen i grader C (flyttal).
==Flash==
Flash-modulen hanterar nedsparning av inställningar och parametrar till flash-minnet (det finns inget EEPROM i stm32f100), så att datan är kvar även när IntroARM stängs av. Eftersom man endast kan spara data i hela pages (en page är 1kByte stor) finns en hel page i slutet av minnet allokerat.<br>
Sparningen är uppdelad som parametrar, d.v.s. man sparar ett värde som en parameter. Varje parameter tar upp 32 bitar (1 Word) i minnet, oavsett vilken storlek den egentligen har. All data "mellanlagras" i en lista (flashParams) för att man ska slippa skriva till flash hela tiden (vilket har sönder flash-minnet) och för att det ska gå lite fortare att läsa.
* Filer:
** flash.c, flash,h
* Settings:
** flashParamType - numen flashParamNames *todo: rätt namn* anger vilka parametrar som ska sparas. Notera att FLASH_NOF_PARAMS alltid måste ligga sist i enumen.
** FLASH_START_ADDRESS - Anger adressen på den flash page där datan ska sparas. Ändra endast denna ifall du behöver spara mer än 1 kByte parametrar (255 st parametrar) eller ifall du har en mindre processor (default nu är processorn med 128kB flash, vilket är STM32f100CBxx-varianten).
* Funktioner:
** flashInit() - Initierar flashmodulen. I dagsläget läser den endast ut värden från flash.
** flashSaveParam(* val, param) - Sparar värdet i val till flashParams på platsen param. Notera att val måste vara en pekare till värdet val (anropa funktionen med &val). Returnerar 0 ifall param inte finns, 1 annars. Notera att värdet inte sparas till flash, utan bara mellanlagras i flashParams. För att spara måste funktionen flashSaveAllParameters(); köras.
** flashReadParam(* outval, param, type) - Läser ut data från en parameter. outval är en pekare till där värdet ska läggas, param är den parameter som ska läsas och type är vilken typ datan ska tolkas som (måste vara FLASH_TYPE). Notera att denna faktiskt inte läser från flash, utan snarare från flashParams-listan. För att få värdena från flash, måste funktionen flashReadAllParameters(); köras.
** flashSaveAllParameters() - Skriver alla parametrar som finnas sparade i flashParams till flash-minnet. OBS! Denna funktion får inte köras hela tiden, eftersom detta skriver sönder flash-minnet. Tips är att köra denna enbart baserad på user input.
** flashReadAllParameters() - Läser alla parametrar sparade i flash och uppdaterar flashParams.
** flashResetDataOnFlash() - Nollställer alla variabler och sparar dessa i flash-minnet. Kan tweakas för att lägga in egna defaultvärden vid behov.


==Buzzer==
==Buzzer==
Piper buzzern i olika frekvenser. Har en viss buffert för att spela upp ljud.
Piper buzzern i olika frekvenser. Har en viss buffert för att spela upp ljud.
* Filer:
* Filer:  
* Settings:
* Settings:
* Funktioner:
* Funktioner:

Latest revision as of 21:46, 12 April 2015

Denna sida innehåller information om programmet för IntroARM. Här finns dokumentation för de specialskrivna biblioteksfunktioner som finns för IntroARM (t.ex. styra LEDs, Motorer, läsa sensorer etc). För mer allmän information om programmering av STM32, kolla på sidan Programmering STM32.

Programmet

Programmet har numera flyttat till Github: https://github.com/ChalmersRobotics/IntroARM. Där finns den senaste revisionen av koden. Varianterna nedan finns för dokumentation.

Olika varianter av programmet hittar du här. Dessa är till för v2 (alltså gamla):
File:IntroARM kod.zip
Denna kod innehåller endast de specifika .c- och .h-filer som IntroARM använder sig av. Zip-filen innehåller ett startup-script (.S-filen) som behövs. Programmet bygger på STs standard-bibliotek som inte följer med, men som kan hittas via STs hemsida (Todo: Lägg till en länk där man hittar det). Det finns inte heller med ett länkarscript, som också behövs.

File:IntroARM Makefile Project.zip
Är ett komplett projekt med samma kod som ovan men innehåller allt som behövs för att kompilera koden under korrekt uppsatt Eclipse i Ubuntu. Detta innebär att bibilotek, länkarskript och makefil finns med. Programmet testar grundläggande funktioner som motorer, knappar, LEDs, sensorer, UART och buzzer.

File:Main start.zip
Detta är en modifierad main-fil som stödjer (till viss del) startmodulsystemet. Det som inte stöds är att den inte sparar sitt state mellan power cycles, så den måste programmeras med en ny startadress varje gång. Detta går att lösa genom att t.ex. nollställa statemaskinen via en knapptryckning (vid kanpptryckning, sätt startState till STATE_POWER) alternativt implementera att den sparas i Flash.

Parameterstyrning

Till v3 lades en funktion till för att enkelt kunna styra vilken hårdvara programmet är skrivet för. Detta anges med hjälp av parametern HARDVARE_REV filen hardwareRev.h. Denna sätts till det numret på hårdvarurevision som ska användas (2 eller 3 finns det stöd för just nu)

Generell info

Målet är att programmet ska vara uppdelat i moduler, d.v.s. att man ska kunna välja att endast använda vissa delar av programmet oberoende av andra delar. Man väljer vilken modul man ska använda genom att inkludera filen (h-filen) för modulen och köra init-funktionen för den.

Port-karta

Nedan följer en beskrivning på vilka portar som är kopplade till vilka funktioner på IntroARM. Notera att "Namn i koden" endast är applicerbart för de portar som det finns en mening att komma åt direkt. För ytterligare funktioner, kolla i databladet för processorn.

Port Pin Funktion Namn i koden (om applicerbart)
PA0 10 Kantsensor höger (2) ADCEdgeRight
PA1 11 Batterimätare ADCBatteryLevel
PA2 12 Kantsensor vänster (1) ADCEdgeLeft
PA3 13 IR-mottagare vänster (4) IR_LEFT
PA4 14 DAC
PA5 15 SPI1 SCK
PA6 16 SPI1 MISO
PA7 17 SPI1 MOSI
PA8 29 Knapp 1 SW1
PA9 30 UART1_TX (BOOT_TX)
PA10 31 UART1_RX (BOOT_RX)
PA11 32 Motor höger PWM1
PA12 33 IR-mottagare bak SENSE_REMOTE
PA13 34 SWDIO (programmering)
PA14 37 SWCLK (programmering)
PA15 38 LED2 LED_2_XXX
PB0 18 Tachometer höger ADCTachometerRight
PB1 19 Tachometer vänster ADCTachometerLeft
PB2 20 LED3/Boot1 LED_3_XXX
PB3 39 LED1 LED_1_XXX
PB4 40 LED4 LED_4_XXX
PB5 41 Motor sleep MOTOR_ENABLE/DISABLE
PB6 42 I2C1 SCL
PB7 43 I2C1 SDA
PB8 45 Buzzer
PB9 46 IR-LEDs puls
PB10 21 UART3_TX
PB11 22 UART3_RX
PB12 25 Knapp 2 SW2
PB13 26 Motor vänster PWM1
PB14 27 Motor vänster PWM2
PB15 28 Motor höger PWM2
PC13 2 IR-mottagare höger IR_RIGHT
PC14 3 IR-mottagare fram höger IR_FR_RIGHT
PC15 4 IR-mottagare fram vänster IR_FR_LEFT

Modulerna

Nedan följer en beskrivning av varje modul. En del filer kan innehålla fler än en modul, vilket gör att dessa moduler är sammankopplade. Det finns också ett antal moduler som är mycket grundläggande för IntroARMs funktion. Dessa bör alltid användas, då många funktioner beror på dessa. Detta är dels standard-peripheral-biblioteket från ST samt time-modulen.
OBS: Det är inte säkert att alla modulerna finns till alla programversioner. Stöd läggs till lite slumpmässigt. De flesta funktioner bör finnas med i mjukvaran för V3.


Exempel-modul

Varje modul beskrivs med en inledande text med generell info om modulen.

  • Filer: Anger vilka c- och h-filer som behövs för modulen.
  • Resurser: Anger vilka hårdvaruresurser modulen använde, t.ex. pinnar, timers, DMA etc.
  • Settings: Anger om det finns några inställningar som kan göras för modulen. Inställningarna är typiskt makros som finns i h-filerna. Detta kan vara t.ex. max-/minvärden etc.
  • Funktioner/Variabler: Anger vilka funktioner som användaren kan använda sig av. Alla moduler har en init-funktion. Funktionerna kan vara saker som att ställa in inställningar i runtime, slå av och på funktioner eller utföra operationer (t.ex. köra motorer, eller blinka LEDs). En del moduler (typiskt sensor-moduler) använder sig av globala variabler som koms åt via h-filen.

Time

Sköter funktioner som har med tid att göra. Här finns även systick-interruptet som går en gång varje ms.

  • Filer: time.c och time.h
  • Settings: Inga
  • Funktioner/Variabler:
    • delay_ms(unsigned long ms): Väntar i ms millisekunder. Under tiden den väntar är det vanliga programflödet låst och processorn svarar endast på interrupt. Mycket användbar.
    • delay_us(unsigned short us): Som delay_us, fast väntar i ett antal mikroskunder istället
    • unsigned long systemTime: Innehåller antal ms sedan processorn startade. Användbar för timings av olika slag, t.ex. timeouter.

syscalls/xprintf

Används för att få en del standard-funktionalitet, såsom printf, till IntroARM. xprintf är en samling "lättare" varianter av standardfunktionerna, men stödjer inte flyttal. Med hjälp av dessa kommer meddelandet från printf/xprintf att skrivas ut på uart1 (den som är kopplad till bootloadern). Det är självklart möjligt att ändra på funktionen _write och få den att skriva ut på någon annan UART (eller t.o.m. någon annan buss).

  • Filer: syscalls.c, syscalls.h, xprintf.c, xprintf.h, uart.c, uart.h, utils.c, utils.h
  • Settings: Inga
  • Funktioner:
    • printf - Standard C-funktion för att skriva ut formaterad text.
    • sprintf - Samma som printf, men skriver till en specad buffer i minnet.
    • xprintf - Fungerar som vanliga printf, men är lite mer lättvikt och stödjer inte flyttal
    • xsprintf - Fungerar som vanliga sprintf, men är lite mer lättvikt och stödjer inte flyttal
    • xfprintf(uartPutcDMA,"sträng",...) - Som printf, men skickar hela strängen via DMA, för att inte blockera för mycket.
    • char* ftostr(float, places) - Konverterar ett flyttal till en sträng (eftersom xprintf inte stödjer flyttal). Float är flyttalet som ska omvandlas och places är antalet decimaler. Funktionen returnerar en nullterminerad sträng. Typisk användning kan vara: xprintf("Temp: %s\n",ftostr(tempFloat,3));
    • float xatof(char*) - Konverterar från en sträng till ett flyttal. Fungerar som standardfunktionen, men är lite lättare. Tar in en nullterminerad sträng (char*) och returernar en float. Blir någonting fel returneras värdet 0.

LEDs

Styr de LEDs som finns på IntroARM.

  • Filer: led.c och led.h
  • Settings: Inga
  • Funktioner:
    • ledInit(): Initierar portar och klockor för LEDs. Släcker även alla LEDs.
    • Makros för varje LED: Varje LED har ett makro som använder för att styra LEDs med. Makrona heter LED_x_cmd() där x är numret på LEDen (1 till 6) och cmd är kommandot, d.v.s. SET, CLEAR eller TOGGLE. Notera att kommandot måste avslutas med ";". Exempel: LED_1_SET(); delay_ms(500); LED_1_CLEAR(); //Tänder en LED, väntar i 500ms och släcker sedan LEDen

Knappar

Hanterar knapparna för användarinput.

  • Filer: sw.c och sw.h
  • Settings: Inga
  • Funktioner:
    • swInit(): Initierar portar och klockor för knapparna. Sätter pulldown Todo: kolla så att det är korrekt
    • Makros för att läsa av knapparna: SW_x där x är numret på knappen (1 eller 2). Makrot har värdet 1 ifall knappen är nedtryckt och 0 ifall den inte är nedtryckt. Exempel: if (SW1) {do_stuff()}

UART

Styr uart-kommunikation

  • Filer:
  • Settings:
  • Funktioner:

Motor

Styr motorerna. Kan styras dels med PWM och dels på hastighet via tachometrarna.

  • Filer: mc.c, mc.h, adc.c, adc.h
  • Settings:
    • MC_RIGHT_DIR och MC_LEFT_DIR ställer åt vilket håll som är "framåt" på motorerna. Dessa kan ställas till -1.0 eller 1.0 och ställs efter test av motorerna.
  • Funktioner:

Front-sensorer

Pulsar IR-LEDs och läser av status hos sensorerna. Gör viss nödvändig databehandling.

  • Filer: ir.c, ir.h
  • Settings:
    • IR_FREQ, IR_FREQ_MAX/MIN - ställer in vilken frekvens IR-LEDsen pulsas med, och därigenom vilken känsligheten på sensorerna (mottagarna är känsligast på 38kHz, och känsligheten sjunker vid andra frekvenser). Rekommenderat är att ställa IR_FREQ_MIN på 38kHz, där mottagaren är som känsligast.
    • IR_SENS_MAX - ställer in hur många steg känsligheten ska kunnas ställas in i. Vad varje steg motsvarar i Hz beräknas automatiskt i makrot IR_SENS_FREQ_STEP. Får vara max 255, men bör vara ganska lågt, runt 16.
    • IR_FILTER_MAX - ställer in hur långt lågpassfiltret för IR-sensorerna ska vara, d.v.s. hur många sampel av samma typ (1 eller 0) som krävs för att det ska räknas som att sensorn "ser".
  • Funktioner:
    • irInit() - Initierar portar, timers etc till IR-sensorerna
    • irEnable()/irDisable() - Slår på och av pulsningen av IR-LEDsen. Kan användas för att spara batteri, och skall användas i väntan på startmodul-signal
    • irSetFreq(unsigned short freq)/irSetSens(unsigned char sens) - Ställer in frekvensen (i Hz)/känsligheten för sensorerna genom att ändra pulsningsfrekvensen på LEDsen (mottagarna är olika känsliga för olika frekvenser). irSetSens tar in ett värde mellan 0 och IR_SENS_MAX och anropar i sin tur irSetFreq.
    • IR_RIGHT, IR_FR_RIGHT, IR_FR_LEFT och IR_LEFT - innehåller det filtrerade värdet på hinderdetektorerna (Höger, höger fram, vänster fram, vänster). Är 1 om sensorn ser, 0 om den inte ser. Kopplade till variablerna irActiven, där n är 1-4 och motsvarar IRMOT1-4.

Exempelkod för att använda sig av hinderdetektorerna:

<syntaxhighlight lang="c" enclose="pre"> irInit(); irSetFreq(38000); irEnable(); while(1) { if(IR_RIGHT) { LED_1_SET(); } else { LED_1_CLEAR(); } if(IR_FR_RIGHT) { LED_2_SET(); } else { LED_2_CLEAR(); } if(IR_FR_LEFT) { LED_3_SET(); } else { LED_3_CLEAR(); } if(IR_LEFT) { LED_4_SET(); } else { LED_4_CLEAR(); } } </syntaxhighlight>

Fjärrkontrollavkodare (RC5)

Tar emot och avkodar meddelanden från mottagaren bak på roboten. Stödjer endast RC5 i dagsläget.

  • Filer: rc5.c, rc5.h
  • Resurser som används:
    • TIM6
    • PA12 + dess interrupt
    • systick-interrupt som går varje sekund.
  • Settings:
    • MAX_ERROR - Ställer hur mycket fel det maximalt får vara på timingen. Denna bör sättas till en delmängd av HALF_BIT_CNT.
  • Funktioner:
    • rc5Init() - initierar rc5-kommunikationen
    • rc5SetCallbackFunction(fun) - ställer in vilken funktion som ska anropas när ett meddelande är mottaget. Funktionen måste ta in en pekare till typen RC5DATA, en struct som innehåller adress och kommando från RC5. Se till att callbackfunktionen inte är för lång, eftersom denna anropas från ett interrupt.
    • rc5Enable/Disable - Slår på/av RC5-funktionen (stänger av interruptet)
    • rc5HasNext()/rc5GetNext(RC5DATA *data) - Kollar ifall det finns ny RC5-data samt hämtar nästa data i buffern. Notera att denna inte fungerar ifall callback-funktion används.

Exempelkod för att använda sig av IR-mottagaren med fjärrkontroll:

<syntaxhighlight lang="c" enclose="pre"> void rc5Callback(RC5DATA *data);

void main () {

rc5SetCallbackFunction(rc5Callback); rc5Init(); while(1) { //RUn main loop }

}

void rc5Callback(RC5DATA *data) { if (data->address_low == RC5_ADR_TV1) { switch(data->command) { case RC5_CMD_1: startRobot() break; case RC5_CMD_2: //Forward stopRobot() break;

} } }


</syntaxhighlight>

Kantsensorer

Sköter ADC och läser av kantsensorerna.

  • Filer: adc.c, adc.h
  • Settings:
  • Funktioner:

Tachometrar

Sköter ADC och läser av tachometrar.

  • Filer: adc.c, adc.h, time.c, time.h, (mc.c, mc.h (för annars skulle det inte hända så mycket))
  • Settings:
  • Funktioner:

Batterimätning

Sköter ADC och mäter batterispänningen. Ger ut ett värde mellan 0 och 4096. Varje LSB motsvarar ungefär 3.2mV på batteriet. För att beräkna en vilket ADC-värde en spänning motsvarar tar du helt enkelt (spänningen i mV)/3.2 (8.4V = 2625 ADC) eller tvärtom: ADC=mV/3.2 och mV=ADC*3.2.

  • Filer: adc.c, adc.h, main.c
  • Settings:
  • Funktioner:
    • ADCBatteryLevel - Ger råvärdet på batterispänningen
    • ADCBattmV - Ger batterispänningen i mV
    • showBattery() - Visar batteristatus på LEDs. Väntar i 1100ms totalt.

Temperaturmätning

Microcontrollern har en inbyggd temperatursensor. Denna finns mappad mot ADCn.

  • Filer: adc.c och adc.h
  • Settings:
  • Funktioner:
    • ADCTempRaw - Ger rådatan från termometern
    • ADCTempDegC - Ger temperaturen i grader C (flyttal).

Flash

Flash-modulen hanterar nedsparning av inställningar och parametrar till flash-minnet (det finns inget EEPROM i stm32f100), så att datan är kvar även när IntroARM stängs av. Eftersom man endast kan spara data i hela pages (en page är 1kByte stor) finns en hel page i slutet av minnet allokerat.
Sparningen är uppdelad som parametrar, d.v.s. man sparar ett värde som en parameter. Varje parameter tar upp 32 bitar (1 Word) i minnet, oavsett vilken storlek den egentligen har. All data "mellanlagras" i en lista (flashParams) för att man ska slippa skriva till flash hela tiden (vilket har sönder flash-minnet) och för att det ska gå lite fortare att läsa.

  • Filer:
    • flash.c, flash,h
  • Settings:
    • flashParamType - numen flashParamNames *todo: rätt namn* anger vilka parametrar som ska sparas. Notera att FLASH_NOF_PARAMS alltid måste ligga sist i enumen.
    • FLASH_START_ADDRESS - Anger adressen på den flash page där datan ska sparas. Ändra endast denna ifall du behöver spara mer än 1 kByte parametrar (255 st parametrar) eller ifall du har en mindre processor (default nu är processorn med 128kB flash, vilket är STM32f100CBxx-varianten).
  • Funktioner:
    • flashInit() - Initierar flashmodulen. I dagsläget läser den endast ut värden från flash.
    • flashSaveParam(* val, param) - Sparar värdet i val till flashParams på platsen param. Notera att val måste vara en pekare till värdet val (anropa funktionen med &val). Returnerar 0 ifall param inte finns, 1 annars. Notera att värdet inte sparas till flash, utan bara mellanlagras i flashParams. För att spara måste funktionen flashSaveAllParameters(); köras.
    • flashReadParam(* outval, param, type) - Läser ut data från en parameter. outval är en pekare till där värdet ska läggas, param är den parameter som ska läsas och type är vilken typ datan ska tolkas som (måste vara FLASH_TYPE). Notera att denna faktiskt inte läser från flash, utan snarare från flashParams-listan. För att få värdena från flash, måste funktionen flashReadAllParameters(); köras.
    • flashSaveAllParameters() - Skriver alla parametrar som finnas sparade i flashParams till flash-minnet. OBS! Denna funktion får inte köras hela tiden, eftersom detta skriver sönder flash-minnet. Tips är att köra denna enbart baserad på user input.
    • flashReadAllParameters() - Läser alla parametrar sparade i flash och uppdaterar flashParams.
    • flashResetDataOnFlash() - Nollställer alla variabler och sparar dessa i flash-minnet. Kan tweakas för att lägga in egna defaultvärden vid behov.

Buzzer

Piper buzzern i olika frekvenser. Har en viss buffert för att spela upp ljud.

  • Filer:
  • Settings:
  • Funktioner:

SD-kort

Läser och skriver data från/till SD-kortet. Kan användas för t.ex. loggning eller lagring av musik (att spela upp på buzzern)

  • Filer:
  • Settings:
  • Funktioner:

I2C

Kommunicerar med I2C.

  • Filer:
  • Settings:
  • Funktioner:

MPU6050

Gör inställningar och läser data från MPU6050 (accelerometer och gyro, x,y,z).

  • Filer: mpu6050.c, mpu6050.h, i2c.c, i2c.h
  • Settings:
  • Funktioner:

DAC (Digital-analog converter)

Skickar ut en analog spänning på en pinne.

  • Filer:
  • Settings:
  • Funktioner: