GlobLib
HAL and API libraries for MCUs and hardware.
stm32f103cb_adc.c
Go to the documentation of this file.
1 
17 #include "stm32f103cb_adc.h"
18 
19 void adc_init(void);
20 
21 /****************************************************************************/
22 // SETUP FUNCTIONS
23 /****************************************************************************/
24 
25 void adc_init(void){
26 
27  rcc_periph_clock_enable(RCC_ADC1);
28  adc_power_off(ADC1);
29 
30  //No clock division
31  rcc_set_adcpre(RCC_CFGR_ADCPRE_PCLK2_DIV2);
32  adc_set_dual_mode(ADC_CR1_DUALMOD_IND);
33  adc_disable_scan_mode(ADC1);
34 
35  //One sample then stop
36  adc_set_single_conversion_mode(ADC1);
37 
38  //Software trigger
39  adc_enable_external_trigger_regular(ADC1, ADC_CR2_EXTSEL_SWSTART);
40 
41  //Calibrate ADC
42  adc_power_on(ADC1);
43  adc_reset_calibration(ADC1);
44 
45  adc_calibrate(ADC1);
46  return;
47 
48 }
49 
51 
52  adc_init();
53  return ADC_addChannel(port,pin);
54 }
55 
56 uint16_t ADC_addChannel(gpio_port port, gpio_pin pin){
57 
58  switch(port){
59 
60  case PORTA:
61 
62  switch(pin){
63 
64  case PIN0:
65 
67  break;
68 
69  case PIN1:
70 
72  break;
73 
74  case PIN2:
75 
77  break;
78 
79  case PIN3:
80 
82  break;
83 
84  case PIN4:
85 
87  break;
88 
89  case PIN5:
90 
92  break;
93 
94  case PIN6:
95 
97  break;
98 
99  case PIN7:
100 
102  break;
103 
104  default:
105 
106  //All other pins have no Adc
107  if(MCU_debugIsEnabled()){
108 
110  }
111  break;
112  }
113  break;
114 
115  case PORTB:
116 
117  switch(pin){
118 
119  case PIN0:
120 
122  break;
123 
124  case PIN1:
125 
127  break;
128 
129  default:
130 
131  //All other pins have no Adc
132  if(MCU_debugIsEnabled()){
133 
135  }
136  return E_ADC_PIN;
137 
138  break;
139 
140  }
141 
142  break;
143 
144  case PORTC:
145 
146  //No pins on this port have an ADC
147  if(MCU_debugIsEnabled()){
149  }
150  return E_ADC_PORT;
151 
152  break;
153 
154  default:
155 
156  //No pins on this port have an ADC
157  if(MCU_debugIsEnabled()){
159  }
160  return E_ADC_PORT;
161  break;
162 
163  }
164 
165  return E_ADC_NOERROR;
166 
167 }
168 /****************************************************************************/
169 // Sample functions
170 /****************************************************************************/
171 
172 uint16_t ADC_sample(gpio_port port, gpio_pin pin){
173 
174  //Map pin to corrent ADC channel
175 
176  switch(port){
177 
178  case PORTA:
179 
180  switch(pin){
181 
182  case PIN0:
183 
184  ADC_SQR3(ADC1) = 0x0;
185  break;
186 
187  case PIN1:
188 
189  ADC_SQR3(ADC1) = 0x1;
190  break;
191 
192  case PIN2:
193 
194  ADC_SQR3(ADC1) = 0x2;
195  break;
196 
197  case PIN3:
198 
199  ADC_SQR3(ADC1) = 0x3;
200  break;
201 
202  case PIN4:
203 
204  ADC_SQR3(ADC1) = 0x4;
205  break;
206 
207  case PIN5:
208 
209  ADC_SQR3(ADC1) = 0x5;
210  break;
211 
212  case PIN6:
213 
214  ADC_SQR3(ADC1) = 0x6;
215  break;
216 
217  case PIN7:
218 
219  ADC_SQR3(ADC1) = 0x7;
220  break;
221 
222  default:
223 
224  //All other pins have no Adc
225  return 0;
226  break;
227  }
228  break;
229 
230  case PORTB:
231 
232  switch(pin){
233 
234  case PIN0:
235 
236  ADC_SQR3(ADC1) = 0x8;
237  break;
238 
239  case PIN1:
240 
241  ADC_SQR3(ADC1) = 0x9;
242  break;
243 
244  default:
245 
246  return 0;
247 
248  break;
249 
250  }
251 
252  break;
253 
254  case PORTC:
255 
256  return 0;
257 
258  break;
259 
260  default:
261 
262  return 0;
263  break;
264 
265  }
266 
267  //Set single conversion
268  ADC_SQR1(ADC1) = 0;
269 
270  //Convert
271  adc_start_conversion_regular(ADC1);
272 
273  //Wait for end of conversion
274  while (!adc_eoc(ADC1));
275  return adc_read_regular(ADC1);
276 }
277 
278 
279 float ADC_volts(gpio_port port, gpio_pin pin){
280 
281  return ((float)ADC_sample(port,pin)/4096.0) * ADC_VOLT_REF;
282 
283 }
Pin 3 of the port.
gpio_port
GPIO ports available for the MCU.
uint16_t ADC_sample(gpio_port port, gpio_pin pin)
Get a sample from the ADC.
Setup the port for ADC.
#define ADC_VOLT_REF
Typical voltage reference value used by ADC_volts()
uint16_t ADC_addChannel(gpio_port port, gpio_pin pin)
Add an aditional channel to the ADC.
Pin 4 of the port.
void MCU_printError(mcu_error errorNum)
Print a given error number as a character stream.
Pin 1 of the port.
uint8_t MCU_debugIsEnabled(void)
Checks if debug is enabled.
mcu_error ADC_setup(gpio_port port, gpio_pin pin)
Initialize ADC for a given port and pin.
Pin 0 of the port.
Pin 2 of the port.
Error ADC: Port doesn't exist with ADC.
float ADC_volts(gpio_port port, gpio_pin pin)
Get a sample from the ADC and convert it to volts.
gpio_pin
GPIO pins available for each port.
Error ADC: No ADC on pin.
Pin 7 of the port.
Error ADC: No error.
Pin 6 of the port.
Port B of the MCU.
mcu_error pinSetup(gpio_mode mode, gpio_port port, gpio_pin pin)
Setup a GPIO pin for a given function.
Pin 5 of the port.
Port C of the MCU.
Header file for stm32f103cb ADC API.
Port A of the MCU.
mcu_error
Error enumerators for the Debug peripheral.