En signalnivågenerator med en ESP32
Designprosjekt 1 på NTNUs kurs i elektroniske systemer. Oppgaven: ta inn et analogt
sinusformet signal X₁(t) og produsere en utgang X₂(t) =
A·X₁(t), der A settes med et hjul brukeren kan vri på. Hele
forsterkningsstyringen går gjennom en ESP32 midt i kjeden: analog inn, analog ut,
programvare i mellom.
Pipelinen
- Inn: en sinus på 229 Hz med 75 mV amplitude.
- Et analogt forsterker- og nivåskifttrinn mapper det bipolare signalet inn i ESP32-ens ADC-vindu på 0–3,3 V.
- Inne i ESP32-en: les sampelet og potensiometerposisjonen; multipliser; skriv til den 8-bits DAC-en.
- Ut: samme sinus, dempet eller forsterket etter posisjonen på hjulet til enhver tid.
Tall
- Maks forsterkning: 3300/(75·2) = 22 (≈ 26,85 dB).
- Maks demping: (3300/255)/150 = 0,086 (≈ −21,28 dB).
- Oppløsning: potensiometeret leses gjennom en 12-bits ADC (4096 steg), så forsterkningsstyringen har et teoretisk steg på (26,85 − (−21,28))/4096 ≈ 0,0118 dB.
- SNR: målt på den analoge front-end-en til omtrent 24–28 dB, hovedsakelig begrenset av inngangstrinnet og ikke ESP32-en selv.
Den varme løkka er én linje, med vilje:
void loop() {
dacWrite(25, ((int)analogRead(35) * (int)analogRead(potPin)) >> 16);
}
Cast til int32 før multiplikasjonen og deretter bitshift 16 plasser
holder resultatet innenfor DAC-ens 0–255-område uten å bruke en divisjon.
Hele greia kjører så fort ADC-en tillater.
Der det svikter, og neste steg
Ved veldig lav forsterkning dominerer kvantiseringen i DAC-en, og utgangen ser ut som en trapp mellom 0 og 6,47 mV. Et passivt utjevningstrinn på utgangen ville ryddet betydelig opp i det, og er det åpenbare neste steget.