Timer1 - 10-bitové PWM a potenciometer

Zápisník experimentátora

Hierarchy: Časovač (timer)

V tomto článku si ukážeme, ako sa používa 10-bitový mód na timeri1. Aby sme si mohli hodnotu striedy pohodlne nastavovať, použijeme jeden potenciometer. Analógové meranie poskytuje 10-bitové rozlíšenie a preto nemusíme robiť žiadnu konverziu. Nameranú hodnotu analógového vstupu si zobrazime na OLED displeji.

Zoznam súčiastok

Potrebujeme tieto súčiastky.

  • Breadboard {linkBreadboard}
  • Rezistor 100R, 10R, 1k {linkR}
  • LED dióda {linkLED}
  • NPN Tranzistor BC547B {linkTransistor}
  • OLED displej {linkOLED}
  • Prepojovacie vodiče
  • Potenciometer
  • Arduino {linkArduino}

Podobný elektrický obvod som už niekoľkokrát vysvetľoval. V tomto prípade je dôležitý pin 9, na ktorom sa nachádza výstup z timera1. Ten je pripojený na NPN tranzistor, ktorý ovláda jas 1W LED. Rezistor 100R používam preto, aby som mohol odfotografovať svietiacu LED. To mi zabezpečuje, že prúd cez LED má iba 20 mA, čo je dostatočná hodnota na to, aby sa LED dala fotografovať.

OLED displej používa knižnicu U8g2. V závislosti na verzii displeja, je potrebné prispôsobiť zapojenie a vybrať vhodný konštruktor. Ak si nie ste istí, používajte pomalšiu verziu s menšou spotrebou pamäte, ktorú je ale možné pripojiť na ľubovoľné piny. Tu je nakreslené zapojenie, ktoré využíva hardvérové SPI a zvyšné piny môžu byť pripojené ľubovoľne.

Program

Program je jednoduchý. Nastavíme si na timeri1 mód 7, čo je 10-bit, Fast PWM. A namiesto funkcie analogWrite používame zapísanie hodnoty do registra OCR1A. Analógové meranie robím 64x a priemerujem ho, aby som dosiahol lepšie vyhladenie nameranej hodnoty. Pozrite si aj sprievodné video, v ktorom ukazujem, že na breadboarde má takéto priemerovanie opodstatnenie a že nedokonalé spoje na breadboarde vedia narobiť pri analógovom meraní problémy.

#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 6, /* reset=*/ 8);

#define ledPin 9

volatile int pwmvalue = 0;
char buff[20];

// Mode 7: 10-bit Fast PWM
void setupTimer1() {
  pinMode(ledPin, OUTPUT);
  TCCR1A = (1 << WGM11) | (1 << WGM10) | (1 << COM1A1);
  TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
  OCR1A = 1;
}

void setup() {
  u8g2.begin();
  u8g2.setFont(u8g2_font_ncenB10_tr);

  setupTimer1();
}

void drawInfo() {
  int y = 12;
  u8g2.firstPage();
  do {

    u8g2.drawStr(0, y, "Arduino Slovakia");
    sprintf(buff, "PWM: %d", pwmvalue);
    u8g2.drawStr(0, y * 3, buff);
  } while ( u8g2.nextPage() );
}

void loop() {
  long v = 0;
  for (int i = 0; i < 64; i++)
    v += analogRead(A0);
  pwmvalue = v / 64;
  OCR1A = pwmvalue;
  drawInfo();
}

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.


20.07.2020


Menu