Forum: Mikrocontroller und Digitale Elektronik adc conversion mode funzt nicht


von mauri (Gast)


Lesenswert?

Edit: Sorry ich war im Beitrag von der Analogtechnik drin, eigentlich 
gehört es hier her.
Bitte Beiträge unter motorsteuerung pwm über poti löschen.

Hallo

Also ich habe mal versucht mit dem stm32l476rg, also dem Nucleo Board,
das ich habe, eine PWM erzeugt, jedoch aber mit dem STMCUBEMX.
Das funktioniert soweit auch. Dann habe ich im main und vor main
folgendes drin weiter unten.

Ich habe den ADC gedebuggt, aber der ADC konvertiert den Wert nur einmal 
und bleibt immer derselbe, obwohl dieser den Continuous mode aktiviert 
hat und ich am Poti drehe..

Ausserdem gefällt mir nicht, dass mir der ADC mit 12bit Auflösung nur
einen Maximalwert von
0x0F7A zeigt, also 3962 statt 4096?? Warum?
1
 /* Includes 
2
 ------------------------------------------------------------------*/
3
 #include "main.h"
4
 #include "stm32l4xx_hal.h"
5
 
6
/* USER CODE BEGIN Includes */
7
 
8
 /* USER CODE END Includes */
9
 
10
 /* Private variables 
11
 ---------------------------------------------------------*/
12
 ADC_HandleTypeDef hadc1;
13
 
14
 TIM_HandleTypeDef htim1;
15
 
16
 /* USER CODE BEGIN PV */
17
 /* Private variables 
18
 ---------------------------------------------------------*/
19
 uint16_t adcValue;
20
 /* USER CODE END PV */
21
 
22
 /* Private function prototypes 
23
 -----------------------------------------------*/
24
 void SystemClock_Config(void);
25
 static void MX_GPIO_Init(void);
26
 static void MX_TIM1_Init(void);
27
 static void MX_ADC1_Init(void);
28
 
29
 void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
30
 
31
 
32
 /* USER CODE BEGIN PFP */
33
 /* Private function prototypes 
34
 -----------------------------------------------*/
35
 
36
 /* USER CODE END PFP */
37
 
38
 /* USER CODE BEGIN 0 */
39
 
40
 /* USER CODE END 0 */
41
 
42
 int main(void)
43
 {
44
 
45
   /* USER CODE BEGIN 1 */
46
 
47
   /* USER CODE END 1 */
48
 
49
   /* MCU 
50
 Configuration----------------------------------------------------------*/
51
 
52
   /* Reset of all peripherals, Initializes the Flash interface and the 
53
 Systick. */
54
   HAL_Init();
55
 
56
   /* USER CODE BEGIN Init */
57
 
58
   /* USER CODE END Init */
59
 
60
   /* Configure the system clock */
61
   SystemClock_Config();
62
 
63
   /* USER CODE BEGIN SysInit */
64
 
65
   /* USER CODE END SysInit */
66
 
67
   /* Initialize all configured peripherals */
68
   MX_GPIO_Init();
69
   MX_TIM1_Init();
70
   MX_ADC1_Init();
71
 
72
   /* USER CODE BEGIN 2 */
73
   HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
74
   ADC_Enable(&hadc1);
75
   HAL_ADC_Start(&hadc1);
76
 
77
   /* USER CODE END 2 */
78
 
79
   /* Infinite loop */
80
   /* USER CODE BEGIN WHILE */
81
   while (1)
82
   {
83
     if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
84
     {
85
       adcValue = HAL_ADC_GetValue(&hadc1);
86
       TIM1->CCR1 = adcValue;
87
     }
88
 
89
   /* USER CODE END WHILE */
90
 
91
   /* USER CODE BEGIN 3 */
92
 
93
   }
94
   /* USER CODE END 3 */
95
 
96
 }
97
98
Hier der ADC
99
100
101
 static void MX_ADC1_Init(void)
102
 {
103
 
104
   ADC_MultiModeTypeDef multimode;
105
   ADC_ChannelConfTypeDef sConfig;
106
 
107
     /**Common config
108
     */
109
   hadc1.Instance = ADC1;
110
   hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
111
   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
112
   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
113
   hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
114
   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
115
   hadc1.Init.LowPowerAutoWait = DISABLE;
116
   hadc1.Init.ContinuousConvMode = ENABLE;
117
   hadc1.Init.NbrOfConversion = 1;
118
   hadc1.Init.DiscontinuousConvMode = DISABLE;
119
   hadc1.Init.NbrOfDiscConversion = 1;
120
   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
121
   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
122
   hadc1.Init.DMAContinuousRequests = DISABLE;
123
   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
124
   hadc1.Init.OversamplingMode = DISABLE;
125
   if (HAL_ADC_Init(&hadc1) != HAL_OK)
126
   {
127
     _Error_Handler(__FILE__, __LINE__);
128
   }
129
 
130
     /**Configure the ADC multi-mode
131
     */
132
   multimode.Mode = ADC_MODE_INDEPENDENT;
133
   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
134
   {
135
     _Error_Handler(__FILE__, __LINE__);
136
   }
137
 
138
     /**Configure Regular Channel
139
     */
140
   sConfig.Channel = ADC_CHANNEL_1;
141
   sConfig.Rank = 1;
142
   sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
143
   sConfig.SingleDiff = ADC_SINGLE_ENDED;
144
   sConfig.OffsetNumber = ADC_OFFSET_NONE;
145
   sConfig.Offset = 0;
146
   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
147
   {
148
     _Error_Handler(__FILE__, __LINE__);
149
   }
150
 
151
 }

von Jacko (Gast)


Lesenswert?

Mag mir nicht alles durchkauen:

Wo ist ADC Init
Wo ist ADC Start / ReStart
Wo ist ADC Lesen

Wenn immer das selbe rauskommt, fehlt offensichtlich der
Re-Start, falls du keine "Hausnummer" einliest und nie ein
Start stattgefunden hat...

von mauri (Gast)


Lesenswert?

Ich frage mich warum deine keine Zeilennummern auftauchen??

ich habe im main das hier drin
1
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
2
   ADC_Enable(&hadc1);
3
   HAL_ADC_Start(&hadc1);

und das in der While
1
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
2
     {
3
       adcValue = HAL_ADC_GetValue(&hadc1);
4
       TIM1->CCR1 = adcValue;

der ADC_Ini ist ganz unten angefügt

Ich habe die anderen Dinge weggelassen, es ist ja jetzt schon 
unübersichtlich.

von mauri (Gast)


Lesenswert?

warum übrigens restart, ich habe ja continuous mode drin??

von mauri (Gast)


Lesenswert?

Ok, ich habe es raus.

Ich habe die Geschwindigkeit mal langsamer gestellt..
sprich auf die langsamste Geschwindigkeit

Also von
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
auf
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;

Aber warum funktioniert das jetzt, den ich warte ja nach wie vor bis die 
Konversion abgeschlossen ist in der while?
Ich wäre um eine Erklärung dankbar.
1
   while (1)
2
   {
3
     if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
4
     {
5
       adcValue = HAL_ADC_GetValue(&hadc1);
6
       TIM1->CCR1 = adcValue;
7
     }
8
 
9
   /* USER CODE END WHILE */
10
 
11
   /* USER CODE BEGIN 3 */
12
 
13
   }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.