Hallo!
Ich verwende den STM32F103VDT6 und das uVision von Keil.
Ich möchte den Tempsensor verwenden.
Ich erhalte leider immer eine Temperatur von -379944°C.
Meine Init: Ausschnitt!
1 | typedef struct{
|
2 | TADCinval AN_MotI; // AN_IN
|
3 | TADCinval AN_IN1;
|
4 | TADCinval AN_TmpSens;
|
5 | }
|
6 | TADCin;
|
1 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
|
2 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCin; // ADC In Variable
|
3 |
|
4 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
5 | DMA_InitStructure.DMA_BufferSize = sizeof(TADCin)/ sizeof(TADCinval);
|
6 |
|
7 | // ADC1 configuration ------------------------------------------------------
|
8 | ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
|
9 | ADC_InitStructure.ADC_ScanConvMode = ENABLE;
|
10 | ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
|
11 | ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
|
12 | ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
|
13 | ADC_InitStructure.ADC_NbrOfChannel = 3;
|
14 | ADC_Init(ADC1, &ADC_InitStructure);
|
15 |
|
16 |
|
17 | // ADC1 regular channel11 configuration
|
18 | ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_71Cycles5); // AN_IN 12.5 + 71.5 = 84 cycles --> 7us
|
19 | ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_71Cycles5); // VNFGND 12.5 + 71.5 = 84 cycles --> 7us
|
20 | ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_71Cycles5); // Pot R43 12.5 + 71.5 = 84 cycles --> 7us
|
21 | ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 4, ADC_SampleTime_71Cycles5); // Pot R56 12.5 + 71.5 = 84 cycles --> 7us
|
22 |
|
23 | // Enable ADC1 DMA
|
24 | ADC_DMACmd(ADC1, ENABLE);
|
25 |
|
26 | // Enable ADC1
|
27 | ADC_Cmd(ADC1, ENABLE);
|
28 |
|
29 | // Enable ADC1 reset calibration register
|
30 | ADC_ResetCalibration(ADC1);
|
31 | // Check the end of ADC1 reset calibration register
|
32 | while(ADC_GetResetCalibrationStatus(ADC1));
|
33 |
|
34 | // Start ADC1 calibration
|
35 | ADC_StartCalibration(ADC1);
|
36 | // Check the end of ADC1 calibration
|
37 | while(ADC_GetCalibrationStatus(ADC1));
|
38 |
|
39 | ADC_TempSensorVrefintCmd(ENABLE);
|
40 |
|
41 | // Start ADC1 Software Conversion
|
42 | ADC_SoftwareStartConvCmd(ADC1, ENABLE);
|
Ich füre noch 2 andere Messungen durch, die funktionieren.
ADC_Channel_16 und _17 sind für den TempSens.
1 | #define V25 1.43
|
2 | #define AVGSLOPE 0.0043
|
3 |
|
4 | int ADC_Device_Mes = 0;
|
5 | int ADC_DevValue = 0;
|
6 | float TempSens_C = 0.0;
|
7 |
|
8 |
|
9 | int DevTemperatur_Measure(void) //ToDo//
|
10 | {
|
11 | ADC_Device_Mes = ADCin.AN_TmpSens; // get the measured ADC value
|
12 | TempSens_C = ((V25 - ADC_Device_Mes)/AVGSLOPE) + 25;
|
13 | return(TempSens_C);
|
14 | }
|
ADC_Device_Mes in Digits, dies ist ja korrekt, damit die Formel am
Schluss °C ergibt.
1 | ADC_InitStructure.ADC_NbrOfChannel = 3;
|
Habe ich auch mit 4 probiert, dann lief nichts mehr
Sieht jemand einen Fehler?