Timer1 - 10bitové PWM a potenciometr

Zápisník experimentátora

Hierarchy: Časovač (timer)

V tomto článku si ukážeme, jak se používá 10bitový mód na timeru1. Abychom si mohli hodnotu střídy pohodlně nastavovat, použijeme jeden potenciometr. Analogové měření poskytuje 10bitové rozlišení a proto nemusíme dělat žádnou konverzi. Naměřenou hodnotu analogového vstupu si zobrazit na OLED displeji.

Seznam součástek

Potřebujeme tyto součástky.

  • Breadboard {linkBreadboard}
  • Rezistor 100R, 10R, 1k {linkR}
  • LED dioda {linkLED}
  • NPN Tranzistor BC547B {linkTransistor}
  • OLED displej {linkOLED}
  • Propojovací vodiče
  • Potenciometr
  • Arduino {linkArduino}

Podobný elektrický obvod jsem už několikrát vysvětloval. V tomto případě je důležitý pin 9, na kterém se nachází výstup z timeru1. Ten je připojen na NPN tranzistor, který ovládá jas 1W LED. Rezistor 100R používám proto, abych mohl vyfotografovat svítící LED. To mi zajišťuje, že proud přes LED má pouze 20 mA, což je dostatečná hodnota pro to, aby se LED dala fotografovat.

OLED displej používá knihovnu U8g2. V závislosti na verzi displeje, je třeba přizpůsobit zapojení a vybrat vhodný konstruktor. Pokud si nejste jisti, použijte pomalejší verzi s menší spotřebou paměti, kterou je ale možné připojit na libovolné piny. Zde je nakresleno zapojení, které využívá hardwarové SPI a zbylé piny mohou být připojeny libovolně.

Program

Program je jednoduchý. Nastavíme si na timeru1 mód 7, což je 10-bit, Fast PWM. A namísto funkce analogWrite používáme zapsání hodnoty do registru OCR1A. Analogové měření dělám 64x a průměruji ho, abych dosáhl lepší vyhlazení naměřené hodnoty. Viz také doprovodné video, ve kterém ukazuji, že na breadboardu má takové průměrování opodstatnění a že nedokonalé spoje na breadboardu mohou nadělat při analogovém měření 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 se nachází na serveru GitHub.


20.07.2020


Menu