1 KHz PWM na Arduino UNO

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Last_HighLander
Příspěvky: 51
Registrován: 07 kvě 2013, 02:00
Bydliště: Ždiar

1 KHz PWM na Arduino UNO

#1 Příspěvek 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

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#2 Příspěvek od ZdenekHQ »

No jestli je to jak všude jinde odvozený děličkou z krystalu, tak budeš muset vyměnit krystal.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
bdn
Příspěvky: 436
Registrován: 16 led 2020, 01:00

#3 Příspěvek 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

Uživatelský avatar
misocko
Příspěvky: 1250
Registrován: 26 čer 2009, 02:00
Bydliště: Hlohovec (Sk)

#4 Příspěvek 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?

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#5 Příspěvek 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ý.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
monterjirka
Příspěvky: 2761
Registrován: 14 čer 2003, 02:00
Bydliště: Blížejov

#6 Příspěvek 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...

Uživatelský avatar
Last_HighLander
Příspěvky: 51
Registrován: 07 kvě 2013, 02:00
Bydliště: Ždiar

#7 Příspěvek 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

Uživatelský avatar
bdn
Příspěvky: 436
Registrován: 16 led 2020, 01:00

#8 Příspěvek 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);
}

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#9 Příspěvek 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...
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
Last_HighLander
Příspěvky: 51
Registrován: 07 kvě 2013, 02:00
Bydliště: Ždiar

#10 Příspěvek 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

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#11 Příspěvek 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.

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#12 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#13 Příspěvek 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.

Uživatelský avatar
Mahoney
Příspěvky: 347
Registrován: 26 říj 2019, 02:00

#14 Příspěvek od Mahoney »

ZdenekHQ píše:…v JSA-51 (google to už nezná, tak teda assembler)…
Ale no tak… 8-) :D

Uživatelský avatar
Last_HighLander
Příspěvky: 51
Registrován: 07 kvě 2013, 02:00
Bydliště: Ždiar

#15 Příspěvek 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
Přílohy
Charger.jpg

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“