1 KHz PWM na Arduino UNO
Moderátor: Moderátoři
- Last_HighLander
- Příspěvky: 51
- Registrován: 07 kvě 2013, 02:00
- Bydliště: Ždiar
1 KHz PWM na Arduino UNO
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
Potrebujem poradiť ako dostať presne 1kHz na PWM pine z Arduina UNO.
Že sa to nedá viem aj sám.
dík
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.
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
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
- ZdenekHQ
- Administrátor
- Příspěvky: 25593
- Registrován: 21 črc 2006, 02:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
@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ý.
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[?]
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[?]
- monterjirka
- Příspěvky: 2761
- Registrován: 14 čer 2003, 02:00
- Bydliště: Blížejov
- Last_HighLander
- Příspěvky: 51
- Registrován: 07 kvě 2013, 02:00
- Bydliště: Ždiar
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
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
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
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);
}
- ZdenekHQ
- Administrátor
- Příspěvky: 25593
- Registrován: 21 črc 2006, 02:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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[?]
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[?]
- Last_HighLander
- Příspěvky: 51
- Registrován: 07 kvě 2013, 02:00
- Bydliště: Ždiar
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
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
- ZdenekHQ
- Administrátor
- Příspěvky: 25593
- Registrován: 21 črc 2006, 02:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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[?]
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[?]
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.
![Smile :)](./images/smilies/icon_smile.gif)
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.
- Last_HighLander
- Příspěvky: 51
- Registrován: 07 kvě 2013, 02:00
- Bydliště: Ždiar
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
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