Quellcode

 

/*************************************************************************************************************************


                                                                                Informationstechnik-Labor


**************************************************************************************************************************


                                                                                i-u-Sensor Software


**************************************************************************************************************************


    Erstellt von: Matthias Moldowan und Ahmad Tafserqa im SS 2014 im Rahmen des Informationstechnik-Labors


    Das Programm misst Spannungswerte am analogen Input PC0 und gibt diese als float-Werte aus.



*************************************************************************************************************************/



//Einbinden der wichtighsten Bibliotheken

#include "stm32f4xx_adc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include <stdio.h>



/************************************************************************************************************************/



//Variablen Definition und Deklaration

int Konvertierung = 0; //Gelesener Wert aus der AD-Wandlung
int temp = 0; //Variable für den Zwischenspeicher
float Spannung = 0; //Variable mit dem Wert aus der AD-Wandlung



/************************************************************************************************************************/



// Funktion für die Einstellung der Hardware auf die AD-Wandlung

void adc_configure()
{

ADC_InitTypeDef ADC_init_structure; //Struktur für die Konfiguration der AD-Wandlung
GPIO_InitTypeDef GPIO_initStructre; //Struktur für die Konfiguration der IO-Pins

//Clock configuration

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC1 ist mit de APB2 peripherie Bus verbunden, welches den sysclk benutzt
RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN,ENABLE);//Clock für den ADC Port

//Analoge Pin Konfiguration

GPIO_initStructre.GPIO_Pin = GPIO_Pin_0;//Kannal 10 ist mit dem PC0 verbunden
GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //Konfiguration des PC0 Pin als analoger Pin
GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //Brauchen kein PushPull
GPIO_Init(GPIOC,&GPIO_initStructre);// Pins mit dem vorgenommenen Einstellung initialisieren

//AD-Wandlung Konfiguration

ADC_DeInit();
ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Right; //Rechtsverschiebung der konvertierten Werte
ADC_init_structure.ADC_Resolution = ADC_Resolution_12b; //Eingangsawert wird zu einem 12bit Wert mit einem maximalen Wert von 4096
ADC_init_structure.ADC_ContinuousConvMode = ENABLE; //Dauerkonvertierung, Werte werden überschrieben
ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; // Konvertierung ist mit dem TIM1 und CC1 synchronisiert
ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //keine externe Triggerung der Wandlung
ADC_init_structure.ADC_NbrOfConversion = 1; //Anzahl der Konvertierungen
ADC_init_structure.ADC_ScanConvMode = DISABLE; //Scan als ein Kannalscan konfiguriert
ADC_Init(ADC1,&ADC_init_structure); //ADC1 mit den vorgenommenen Einstellung initialisieren

//Schalte die AD-Wandlung frei

ADC_Cmd(ADC1,ENABLE);

//Auswahl des Kannals aus dem gelesen wird

ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_144Cycles);

}



/************************************************************************************************************************/



int adc_convert()
{
ADC_SoftwareStartConv(ADC1);//Startet die Konvertierung
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Flag beobachten
return ADC_GetConversionValue(ADC1); //AD-Wandlungswert übergeben
}



/************************************************************************************************************************/



int main(void)
{ // main-Start

adc_configure();//Start der Konfiguration

while(1)
{ // while-Schleife-Start
{
Konvertierung = adc_convert();
temp = ((Konvertierung * 3000)/4095) ; // Zwischenspeicherwert
Spannung = ((float)temp) / 1000; // Berechneterspannungswert als float

}
} // while-Schleife-Ende
} // main-Ende



/*************************************************************************************************************************


                                                                                 Programm-Ende


**************************************************************************************************************************/