Stránka 1 z 2

1 KHz PWM na Arduino UNO

Napsal: 15 led 2021, 20:53
od Last_HighLander
Ahojte kóderi.
Potrebujem poradiť ako dostať presne 1kHz na PWM pine z Arduina UNO.
Že sa to nedá viem aj sám.

dík

Napsal: 15 led 2021, 21:04
od ZdenekHQ
No jestli je to jak všude jinde odvozený děličkou z krystalu, tak budeš muset vyměnit krystal.

Napsal: 15 led 2021, 21:57
od bdn
Krystal měnit není potřeba.

CTC mód je přímo dělaný na vyrábění frekvence, v datasheetu je na to formulka na str. 196.
fout = fin / (2*prescaler*(OCRnx+1))

Postup např. pro krystal 16MHz lze rozdělit takto
1/
např. fin= 16MHz -> fout=2kHz
n= (16.000.000 Hz/ 2.000 Hz) = 8.000

2/
8.000 = (64) .(125)
takže např. prescaler nastavit na 64x a OCRnx=(125-1)

3/ o podělení 2x dojde 'automaticky' na output waveform bloku

PS. jako inspirace tady chlápek zapojil dva timery/country za sebou, aby dosáhnul 1Hz URL:
https://create.arduino.cc/projecthub/mo ... -pc-a19f63

Napsal: 15 led 2021, 22:04
od misocko
Last_HighLander píše:Že sa to nedá viem aj sám.
ked vies ze sa to neda, tak naco sa kurna pytas?

Napsal: 16 led 2021, 00:42
od ZdenekHQ
@bdn: Ale on píše o PWM, ta je většinou generovaná jinak než CTC. Já taky umím vygenerovat téměř libovolnej kmitočet na pinu, ale nemím do něho následně nacpat PWM.

Tady je otázka, co je vlastně důležitý.

Napsal: 16 led 2021, 09:58
od monterjirka
Záleží na tom co vše dalšího má ještě modul dělat. Dokázal bych si na portu a konkrétním pinu vytvořit PWM s jakoukoliv frekvencí (v nějakém rozumném rozsahu od - do), ale trochu bych tím zaměstnal jádro, časovače, omezil možnosti interuptu...

Napsal: 16 led 2021, 10:04
od Last_HighLander
OK, trocha ste mi pomohli, našiel som v CTC mode kalkulačku:
https://www.arduinoslovakia.eu/applicat ... calculator

Krásne - kalkulačka napíše sama kód pre 1kHz, to je dobrá správa. Tá zlá je, že strieda je 50%, ja však potrebujem na výber striedy: 5%, 10%, 16%, 25%. Tu presnosť nie je až taká limitná. (Preto bol pôvodný zámer PWM)

Viete mi poradiť ako zmeniť striedu v CTC mode?

Veľké díky za pomoc.
HL

Napsal: 16 led 2021, 12:40
od bdn
Pokud chceme PWM 1kHz,tak není problém.
Chce to najít si datasheet pro atmega328(P) a podívat se.
K dispozici jsou 3 časovače, z toho TC0 a TC1 umí 'variable PWM period'

Např. časovač TC1, datasheet s.166
Phase and Frequency Correct PWM Mode
focnx_pfc_pwm = fin/(2.N.TOP)

1/ 16.000.000Hz/1.000Hz = 16.000
2/ nastavit TC1 na mode 0x8, nastavit WGMx bity a COMx bity
3/ ICR1 (TOP) nastavit na (125)
4/ OCR1A (duty) se nastaví na někam v rozsahu (0..124)
5/ prescaler nastavit na (64)

PS. pro ladění pomůže osciloskop

Kód: Vybrat vše

/*
  file: test_pwm.ino
*/

// pwm_1khz_set_pwm_duty(0);
//
void pwm_1khz_set_pwm_duty( uint8_t value)
{
  if (value < 125)
  {
    OCR1A = value;
  }
  else
  {
    OCR1A = (125 - 1);
  }
}

// pwm_1khz_setup_oc1a_pb1_IO9();
//
// Phase and Frequency correct PWM mode x8
// TOP is 125
// duty is 0
// prescaler is 64
// enable pin as output
void pwm_1khz_setup_oc1a_pb1_IO9( void)
{
  TCCR1A = 0;
  TCCR1B = 0;
  //
  // WGM: 0b1000, mode: 0x8,
  // COM1A:0b10, clear output on compare match when upcounting
  //
  TCCR1A = _BV(COM1A1);

  // ICR1
  ICR1 = (125);

  // OCR1A
  OCR1A = (0);

  // CS: 0b011, prescaler: 64
  //
  TCCR1B = _BV(WGM13) | (0b011 << CS10);

  // OC1A is PB1 is IO9
  DDRB |= _BV(PB1);
}


void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);           //  setup serial
  pwm_1khz_setup_oc1a_pb1_IO9();
}


void loop() {
  
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second

  uint8_t i = 0;
  do
  {
    pwm_1khz_set_pwm_duty(i);
    Serial.println(i);          // debug value
    delay(200);
    i = i + 1;
  }
  while (i < 125);
}

Napsal: 17 led 2021, 17:54
od ZdenekHQ
No jo, to je výhoda, když si ten krystal můžeš dělit libovolným číslem i u PWM. Ty malý potvory umí většinou jen mocninu dvou...

Napsal: 17 led 2021, 18:11
od Last_HighLander
Veľké uznanie za odpoveď a kód od BDN. Naozaj správne funguje, striedu si môžem softvérovo meniť, výstup má 1kHz. Skvelé, moja požiadavka je vyriešená.

Celkovo však zapojenie ešte nekomunikuje s autom, zrejme je teraz problém s presnosťou zdroja +-12V. Ten ma v kladnej vetvi iba +11.6V. Budem ho musieť vymeniť... uvidím či sa veci pohnú.

Ešte raz, vďaka za pomoc.
HL

Napsal: 18 led 2021, 21:09
od FHonza
ZdenekHQ píše:Ty malý potvory umí většinou jen mocninu dvou...
Vyzkoušej nové malé potvory, jako třeba Attiny412, 416. Cena příznivá, dělají se i v SOIC.

Napsal: 18 led 2021, 22:21
od ZdenekHQ
Když já to mám odladěný "na tělo" v JSA-51 (google to už nezná, tak teda assembler) a jen to přehazuju. Jsem přes HW, ty nohatý potvory beru jen jako nutnost.

Napsal: 18 led 2021, 22:58
od FHonza
Schválně jsem kouknul do knižnice ČSCTS-FEL "Nové typy jednoobvodových mikropočítačů řady 8051 a 8096" z roku 1990. A ani tam už není nikde JAS :)

Původním příspěvkem jsem chtěl říct, že existuje celá (relativně) nová řada TinyAVR, se kterou lze hodně úloh řešit mnohem jednodušeji. Už jenom to, že mají konečně I²C a DAC.

Napsal: 19 led 2021, 11:59
od Mahoney
ZdenekHQ píše:…v JSA-51 (google to už nezná, tak teda assembler)…
Ale no tak… 8-) :D

Napsal: 19 led 2021, 19:05
od Last_HighLander
Už to funguje!!

Myslím, že si to zaslúži vysvetlenie.
Postavil som troj-fázovú 11kW nabíjačku pre Peugeot e2008. Tá v domácich podmienkách nabíja auto 64km/hod.
Nabíjačku, ktorú Vám pribalia v základe má iba 1.8kW! a nabíja cca 6km/hod. Takže teraz nabíjam 10x rýchlejšie, mám však prepínač
aby to mohlo ísť aj pomalšie. Rýchlonabíjačku v meste mám zatiaľ oskúšanú jednu s 360km/hod.

Nakoniec stačilo použiť klasické PWM arduina s 988Hz a PC zdroj tiež plne vyhovoval. V schéme na webe chýbal odpor, ktorý mal byť priamo v konektore - ten mal nastavovať medzné hodnoty výkonu nabíjania.

Ak by mal niekto na fóre záujem poskytnem zapojenie aj softvér.

Ešte raz veľká vďaka za pomoc.
HL