|
17 | 17 | #define AP3_ANALOG_FRAME_PERIOD (24000) |
18 | 18 | #define AP3_MAX_ANALOG_WRITE_WIDTH (0x0000FFFF) |
19 | 19 | #define AP3_MIN_ANALOG_WRITE_WIDTH (0x03) |
20 | | -#define AP3_MAX_PWM_RESOLUTION (16) |
| 20 | +#define AP3_ANALOG_WRITE_RESOLUTION_MAX (16) |
| 21 | +#define AP3_ANALOG_WRITE_RESOLUTION_MIN (1) |
21 | 22 | #define AP3_ANALOG_READ_RESOLUTION_MAX (16) |
| 23 | +#define AP3_ANALOG_READ_RESOLUTION_MIN (1) |
22 | 24 | #define AP3_ADC_RESOLUTION (14) |
23 | 25 |
|
24 | 26 | int ap3_analog_read(ap3_adc_channel_config_t* config); |
@@ -50,6 +52,32 @@ ap3_adc_channel_config_t ap3_adc_channel_configs[] = { |
50 | 52 | { 0, AP3_ADC_INTERNAL_CHANNELS_VSS, AM_HAL_ADC_SLOT_CHSEL_VSS, 0, }, |
51 | 53 | }; |
52 | 54 |
|
| 55 | +float getTempDegF( void ) { |
| 56 | + const float v_ref = 2.0; |
| 57 | + uint16_t counts = analogReadTemp(); |
| 58 | + |
| 59 | + // |
| 60 | + // Convert and scale the temperature. |
| 61 | + // Temperatures are in Fahrenheit range -40 to 225 degrees. |
| 62 | + // Voltage range is 0.825V to 1.283V |
| 63 | + // First get the ADC voltage corresponding to temperature. |
| 64 | + // |
| 65 | + float volts = ((float)counts) * v_ref / ((float)(pow(2, _analogReadResolution))); |
| 66 | + |
| 67 | + float fVT[3]; |
| 68 | + fVT[0] = volts; |
| 69 | + fVT[1] = 0.0f; |
| 70 | + fVT[2] = -123.456; |
| 71 | + uint32_t ui32Retval = am_hal_adc_control(g_ADCHandle, AM_HAL_ADC_REQ_TEMP_CELSIUS_GET, fVT); |
| 72 | + MBED_ASSERT(ui32Retval == AM_HAL_STATUS_SUCCESS); |
| 73 | + |
| 74 | + return fVT[1]; // Get the temperature |
| 75 | +} |
| 76 | + |
| 77 | +float getVCCV( void ){ |
| 78 | + return ((float)analogReadVCCDiv3() * 6.0) / 16384.0; |
| 79 | +} |
| 80 | + |
53 | 81 | int indexAnalogRead(pin_size_t index){ |
54 | 82 | // todo: replace with mbed "AnalogIn" functionality |
55 | 83 | pin_size_t pinNumber = pinNumberByIndex(index); |
@@ -157,8 +185,12 @@ void indexTone(pin_size_t index, unsigned int frequency, unsigned long duration) |
157 | 185 | } |
158 | 186 |
|
159 | 187 | ap3_err_t analogWriteResolution(uint8_t bits){ |
160 | | - if (bits > AP3_MAX_PWM_RESOLUTION){ |
161 | | - _analogWriteResolution = AP3_MAX_PWM_RESOLUTION; |
| 188 | + if (bits > AP3_ANALOG_WRITE_RESOLUTION_MAX){ |
| 189 | + _analogWriteResolution = AP3_ANALOG_WRITE_RESOLUTION_MAX; |
| 190 | + return AP3_ERR; |
| 191 | + } |
| 192 | + if (bits < AP3_ANALOG_WRITE_RESOLUTION_MIN){ |
| 193 | + _analogWriteResolution = AP3_ANALOG_WRITE_RESOLUTION_MIN; |
162 | 194 | return AP3_ERR; |
163 | 195 | } |
164 | 196 | _analogWriteResolution = bits; |
@@ -187,8 +219,12 @@ ap3_err_t analogWriteFrequency(float freq){ |
187 | 219 | } |
188 | 220 |
|
189 | 221 | ap3_err_t servoWriteResolution(uint8_t bits){ |
190 | | - if (bits > AP3_MAX_PWM_RESOLUTION){ |
191 | | - _servoWriteResolution = AP3_MAX_PWM_RESOLUTION; |
| 222 | + if (bits > AP3_ANALOG_WRITE_RESOLUTION_MAX){ |
| 223 | + _servoWriteResolution = AP3_ANALOG_WRITE_RESOLUTION_MAX; |
| 224 | + return AP3_ERR; |
| 225 | + } |
| 226 | + if (bits < AP3_ANALOG_WRITE_RESOLUTION_MIN){ |
| 227 | + _servoWriteResolution = AP3_ANALOG_WRITE_RESOLUTION_MIN; |
192 | 228 | return AP3_ERR; |
193 | 229 | } |
194 | 230 | _servoWriteResolution = bits; |
@@ -224,6 +260,10 @@ ap3_err_t analogReadResolution(uint8_t bits){ |
224 | 260 | _analogReadResolution = AP3_ANALOG_READ_RESOLUTION_MAX; |
225 | 261 | return AP3_ERR; |
226 | 262 | } |
| 263 | + if(bits < AP3_ANALOG_READ_RESOLUTION_MIN){ |
| 264 | + _analogReadResolution = AP3_ANALOG_READ_RESOLUTION_MIN; |
| 265 | + return AP3_ERR; |
| 266 | + } |
227 | 267 | _analogReadResolution = bits; |
228 | 268 | return AP3_OK; |
229 | 269 | } |
@@ -306,12 +346,12 @@ uint32_t powerControlADC(bool on){ |
306 | 346 | uint32_t status = AM_HAL_STATUS_SUCCESS; |
307 | 347 |
|
308 | 348 | if(on){ |
309 | | - status = am_hal_adc_power_control(g_ADCHandle, AM_HAL_SYSCTRL_WAKE, false); |
310 | | - if(status != AM_HAL_STATUS_SUCCESS){ return status; } |
311 | | - |
312 | 349 | status = am_hal_adc_initialize(0, &g_ADCHandle); |
313 | 350 | if(status != AM_HAL_STATUS_SUCCESS){ return status; } |
314 | 351 |
|
| 352 | + status = am_hal_adc_power_control(g_ADCHandle, AM_HAL_SYSCTRL_WAKE, false); |
| 353 | + if(status != AM_HAL_STATUS_SUCCESS){ return status; } |
| 354 | + |
315 | 355 | adc_initialized = true; |
316 | 356 | }else{ |
317 | 357 | adc_initialized = false; |
@@ -395,21 +435,15 @@ int ap3_analog_read(ap3_adc_channel_config_t* config){ |
395 | 435 |
|
396 | 436 | // Clear the ADC interrupt. |
397 | 437 | am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false); |
398 | | - if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask)){ |
399 | | - return 0; //Error |
400 | | - } |
| 438 | + MBED_ASSERT(AM_HAL_STATUS_SUCCESS == am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask)); |
401 | 439 |
|
402 | 440 | am_hal_adc_sw_trigger(g_ADCHandle); |
403 | 441 |
|
404 | 442 | do { // Wait for interrupt |
405 | | - if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false)){ |
406 | | - return 0; //Error |
407 | | - } |
| 443 | + MBED_ASSERT(AM_HAL_STATUS_SUCCESS == am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false)); |
408 | 444 | } while(!(ui32IntMask & AM_HAL_ADC_INT_CNVCMP)); |
409 | 445 |
|
410 | | - if (AM_HAL_STATUS_SUCCESS != am_hal_adc_samples_read(g_ADCHandle, false, NULL, &ui32NumSamples, &Sample)){ |
411 | | - return 0; //Error |
412 | | - } |
| 446 | + MBED_ASSERT(AM_HAL_STATUS_SUCCESS == am_hal_adc_samples_read(g_ADCHandle, false, NULL, &ui32NumSamples, &Sample)); |
413 | 447 |
|
414 | 448 | uint32_t result = Sample.ui32Sample; |
415 | 449 |
|
|
0 commit comments