// adc_devel.ino #include #include "my_printf.h" #define printf my_printf // "Umleiten" des originalen printf auf eigenes my_printf // sodass innerhalb dieses Programms dieses abgespeckte printf verwendet // werden kann /* -------------------------------------------------- my_putchar wird von my_printf benoetigt und hier wird die Funktion aufgerufen, auf die my_printf ein Zeichen streamt -------------------------------------------------- */ void my_putchar(char ch) { Serial.print(ch); } class ADC { public: ADC(uint32_t pin) { _channel = pintochannel(pin); } uint16_t read() { adc_init(_channel); ADC1->CTLR2 |= ADC_SWSTART; while(!(ADC1->STATR & ADC_EOC)) { } return ADC1->RDATAR; } private: uint32_t _channel; uint32_t pintochannel(uint32_t pin) { switch(pin) { case PA2: return 0; case PA1: return 1; case PC4: return 2; case PD2: return 3; case PD3: return 4; case PD5: return 5; case PD6: return 6; case PD4: return 7; default: return 0; } } void adc_init(uint32_t channel) { uint8_t portbit; portbit = 1; RCC->CFGR0 &= ~(0x1F << 11); RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_ADC1; switch(channel) { case 0: portbit = 2; GPIOA->CFGLR &= ~(0xf << (4 * portbit)); break; case 1: portbit = 1; GPIOA->CFGLR &= ~(0xf << (4 * portbit)); break; case 2: portbit = 4; GPIOC->CFGLR &= ~(0xf << (4 * portbit)); break; case 3: portbit = 2; GPIOD->CFGLR &= ~(0xf << (4 * portbit)); break; case 4: portbit = 3; GPIOD->CFGLR &= ~(0xf << (4 * portbit)); break; case 5: portbit = 5; GPIOD->CFGLR &= ~(0xf << (4 * portbit)); break; case 6: portbit = 6; GPIOD->CFGLR &= ~(0xf << (4 * portbit)); break; case 7: portbit = 4; GPIOD->CFGLR &= ~(0xf << (4 * portbit)); break; default: portbit = channel; break; } RCC->APB2PRSTR |= RCC_APB2Periph_ADC1; RCC->APB2PRSTR &= ~RCC_APB2Periph_ADC1; ADC1->RSQR1 = 0; ADC1->RSQR2 = 0; ADC1->RSQR3 = channel; ADC1->SAMPTR2 &= ~(ADC_SMP0 << (3 * portbit)); ADC1->SAMPTR2 |= 7 << (3 * portbit); ADC1->CTLR2 |= ADC_ADON | ADC_EXTSEL; ADC1->CTLR2 |= ADC_RSTCAL; while(ADC1->CTLR2 & ADC_RSTCAL) { } ADC1->CTLR2 |= ADC_CAL; while(ADC1->CTLR2 & ADC_CAL) { } } }; uint16_t calc_spg(uint16_t adc_digit, uint16_t refvolt) { // 10-Bit ADC: max = 1023 // Ergebnis in 1/100 V, z.B. 3.45 V => 345 return ((uint32_t)adc_digit * refvolt) / 1023 / 10; } ADC analog1(PD4); ADC analog2(PA1); void setup() { Serial.begin(115200); printf("\n\r --------------------------------------\n\r"); printf(" CH32V003 running at 48 MHz \n\r"); printf(" 16 kByte Flash, 2 KByte RAM \n\r"); printf(" \n\r"); printf(" Arduino-Demo: ADC \n\r"); printf(" \n\r"); printf(" 23.02.2026 R. Seelig \n\r"); printf(" --------------------------------------\n\n\r"); } void loop() { uint16_t count = 0; uint16_t val1, val2; printfkomma= 2; while(1) { val1 = calc_spg(analog1.read(), 4990); delay(20); val2 = calc_spg(analog2.read(), 4990); printf("\r Counter: %d | ADC-Value1: %k V | ADC-Value2: %k V ", count, val1, val2); count++; delay(1000); } }