PicoBasic 2.3 für den RPi Pico                           

Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic         




Download: PicoBasic23.zip

Der RPi Pico war der erste, mit dem PicoBasic entwickelt wurde. Aber dann haben die beiden anderen Controller ihn in der Versionsnummer überholt. Mit etwas Verspätung zieht der Pico nun nach. Jetzt sind auch hier die Funktionserweiterungen möglich. Das Beispielprogramm Scope242 macht Gebrauch davon. Mit Gosub L242 wird das schnelle Oszilloskop aufgerufen. Und vorher wurde mit A = 5 und Gosub 240 die PWM-Frequenz auf 10 kHz eingestellt.





Für die Messung wurde ein RC-Filter mit 10 kΩ und 22 nF zwischen PWM-Ausgang und AD0 geschaltet. Das Messergebnis bestätigt die mittlere Spannung entsprechend der PWM-Ausgabe 127. Für eine vollständige Glättung der Ausgangsspannung müsste der Kondensator noch wesentlich größer werden.  Insgesamt werden 12 Schwingungen mit 250 Messpunkten aufgezeichnet. Die Abtastfrequenz beträgt also 10 kHz * 250 / 12 = 208 kHz. Ein neuer Rekord für PicoBasic!



Mit dem schnellen Oszilloskop sind nun Messungen möglich, die vorher nicht machbar waren. Hier wurde das PWM-Signal direkt gemessen. Die PWM-Frequenz war 2 kHz, eine Impulslänge also 0,25 ms. Bei der höheren Spannung sieht man eine Welligkeit, die offensichtlich durch den 3,3V-Schaltregler des Pico verursacht wird. Auf jedem Impuls sieht man acht Schwingungen. Das bedeutet, dass der Schaltregler offensichtlich mit 32 kHz nachregelt. Das Problem ist bekannt und führt zu einer begrenzen Messgenauigkeit. Aber da kann man etwas tun.

void extensions(void){  
  if (dat==240){    //PWM Freq
    uint8_t pre[11] = {250, 166, 125, 100, 50, 25, 20, 10, 5, 2, 1};
    pwm_set_enabled(4,false);
    pwm_config cfg = pwm_get_default_config();
    pwm_config_set_clkdiv_int (&cfg, pre[a]);
    pwm_init(4, &cfg, true);
    pwm_set_wrap(4, 511);
    pwm_set_gpio_level(8,pw1*2);
    pwm_set_gpio_level(9,pw2*2);
    pwm_set_enabled(4,true);
    warten = 20;  //Wartezeit 20 ms erforderlich. Warum??
  }
  if (dat==241){          //keine Uref                          
    pinMode(23,1);
    digitalWrite(23,1);   //Uregler Mode
  }
  if (dat==242){            //Hispeed Scope
    for (uint16_t n=0;n<256;n++){ram[n]=analogRead(A0) >>2;}
  }
  if (dat==243){            //Zweikanal Scope
    for (uint16_t n=0;n<256;n++){ram2[n*2]=analogRead(A0) >>2;
      ram2[n*2+1]=analogRead(A1) >>2;}
    for (uint16_t n=0;n<500;n++){Serial.println(ram2[n]);}
  }
  if (dat==244){            //Sinustabelle
    for (uint16_t n=0;n<256;n++){ram[n]=127+127*sin(3.14159*2*n/256);}
  }

Bei den anderen beiden Controllern kann man mit Gosub 241 die Spannungsreferenz des AD-Wandlers umschalten. Der Pico kennt diese Möglichkeit nicht. Deshalb wird diese Erweiterungsfunktion hier anders benutzt. Sie setzt den Port 23 hoch, der nicht nach außen geführt ist, aber den Betriebsmodus des Schaltreglers umschaltet. Statt einzelner Bursts erzeugt dieser nun ein Schaltsignal mit konstanter Frequenz von ca. 920 kHz. Dadurch wird zwar der Wirkungsgrad schlechter, aber die Ausgangsspannung wird sehr viel sauberer.

              REM Scope241
              L1:
0x03F9  C = 249
0x0200  B = 0
              L2:
0x3C00  A = AD0
0x3B00  [B+] = A
0x2502  C*Goto L2:
0x107F  PWM1 = 127
0x21F1  Gosub L241:
              REM Ureg
0x21F2  Gosub L242:
              REM Scope
0x03F9  C = 249
0x0200  B = 0
              L3:
0x3A00  A = [B+]
0x4200  Print A
0x250A  C*Goto L3:
0x1A01  Delay s = 1
0x2000  Goto L1:



Die PWM-Spannung zeigt nun nur noch Schwankungen von einem Bit, die auch bei völlig glatter Betriebsspannung bei jedem AD-Wandler auftreten können. Mit diesem Unterschied hat der Pico wie der Arduino nun alle Erweiterungen von 240 (PWM-Frequenzen)  bis 246 (NF-Sweepgenerator).

Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic