12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #include "ch.h"
- #include "hal.h"
- #include "analog.h"
- #if HAL_USE_ADC != TRUE
- #error "HAL_USE_ADC must be set"
- #endif
- void adc_init(void)
- {
- adc_lld_init();
- rccEnableADC1(true);
-
- ADC1->SMPR2 = ADC_SMPR2_SMP_AN4(ADC_SAMPLE_28P5) | ADC_SMPR2_SMP_AN5(ADC_SAMPLE_28P5);
-
- ADC1->SQR1 = 0;
- ADC1->SQR2 = 0;
- }
- static uint16_t adc_sample_channel(uint32_t channel)
- {
-
- ADC1->SR = 0;
-
- ADC1->SQR3 = channel;
- ADC1->CR2 |= ADC_CR2_ADON;
-
- uint32_t counter = 16;
- while (!(ADC1->SR & ADC_SR_EOC)) {
- if (--counter == 0) {
-
- ADC1->SR = 0;
- return 0xffff;
- }
- }
-
- return ADC1->DR;
- }
- uint16_t adc_sample_vservo(void)
- {
- const uint32_t channel = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN4);
- return adc_sample_channel(channel) * 9900 / 4096;
- }
- uint16_t adc_sample_vrssi(void)
- {
- const uint32_t channel = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN5);
- return adc_sample_channel(channel) * 9900 / 4096;
- }
|