|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 01 21, 06:49. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Programavimas » Su PWM valdymu nesusitvarkau
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 09:58 |
|
|
|
Šiokį tokį suraičiau PWM valdymą, bet jis "šlubas" jei startuoja kaip ir tvarkingai nuo 350 ir reguliuojasi į visas puses, bet kai nuvarai iki 500 t.y. stop atgal nebegaliu sugrįžti tenka restartinti, ko neįvyksta priešingai kai PWM didini t.y. link 0, 0=max apsukos, jos ten "neužsikerta".
Suprantu, kad primityvus kodas, bet gal galite psiūlyti kokį sprendimo būdą kaip "neužstrikti tie 500?
#include <Wire.h>
#include <avr/interrupt.h>
int MotorPWM = 10;
int MotorSpeed = 350; // vary this value between 0 and 500 for 9-bit precision whereby 500 = stop and 0 = full speed
/*čia išimti membraninės 4x4 klaviatūros ir LCD nustatymai ir bibliotekos*/
void setup()
{
TCCR1A = B11110010;
TCCR1B = B00010001;
ICR1 = 500 ; // 9 bit resolution, this value sets the frequency of the PWM-signal to 16kHz
OCR1B = 500; // vary this value between 0 (max power) and 500 (500 = off) for 9-bit precision - PWM at pin MotorPWM
pinMode(MotorPWM, OUTPUT); // declare the port as an OUTPUT OCR1A = 1023;
analogWrite(MotorPWM,MotorSpeed); //initialize primary pwm
}
void loop()
{
// čia išimti LCD informaciniai pranešimai
if (Key =='1')
{
lcd.clear();
lcd.setCursor(0,0); lcd.print("didiname apsukas");
if (MotorSpeed > 0) {MotorSpeed = MotorSpeed -50; lcd.setCursor(10,1); lcd.print(MotorSpeed);}
if (OCR1A < 500) {OCR1A = MotorSpeed;}
if (OCR1B < 500) {OCR1B = MotorSpeed;}
}
if (Key == '7')
{
lcd.clear();
lcd.setCursor(0,0); lcd.print("maziname apsukas");
if (MotorSpeed < 500) {MotorSpeed = MotorSpeed +50; lcd.setCursor(10,1); lcd.print(MotorSpeed);}
if (OCR1A < 500) {OCR1A = MotorSpeed;}
if (OCR1B < 500) {OCR1B = MotorSpeed;}
}
} |
|
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 11:04 |
|
|
|
Tiesa sakant nesigilinau i koda, bet siaip uzmetus aki panasu, kad nezinai tokiu salygu kaip "daugiau arba lygu" >= ir "maziau arba lygu" <=.
Citata: |
if (MotorSpeed > 0) {MotorSpeed = MotorSpeed -50; lcd.setCursor(10,1); lcd.print(MotorSpeed);}
if (OCR1A < 500) {OCR1A = MotorSpeed;}
if (OCR1B < 500) {OCR1B = MotorSpeed;}
}
if (Key == '7')
{
lcd.clear();
lcd.setCursor(0,0); lcd.print("maziname apsukas");
if (MotorSpeed < 500) {MotorSpeed = MotorSpeed +50; lcd.setCursor(10,1); lcd.print(MotorSpeed);}
if (OCR1A < 500) {OCR1A = MotorSpeed;}
if (OCR1B < 500) {OCR1B = MotorSpeed;}
}
}
|
copy-pasta bug'as?
O siaip del bendros kulturos, kiekvienas kintamuju priskyrimas turi buti naujoje eiluteje. Pratinkis dabar, nes jei teks dirbti kokioje rimtesneje kompanijoje, tai kodo tikrinimo irankiai tokio dalyko nepraleis. Pvz.:
Kodas: |
if (MotorSpeed > 0) {
MotorSpeed = MotorSpeed - 50;
lcd.setCursor(10,1);
lcd.print(MotorSpeed);
}
|
|
|
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 11:47 |
|
|
|
Socrates rašo: |
Tiesa sakant nesigilinau i koda, bet siaip uzmetus aki panasu, kad nezinai tokiu salygu kaip "daugiau arba lygu" >= ir "maziau arba lygu" <=.
copy-pasta bug'as? |
Kadangi aš neprogramuotojas, o tik laisvalaikiu bandau eksperimentuoti šioje srityje, kartais pasitikėjimas "ale' programuotojais" pakiša koją. Kaip ir šiuo atveju tai nukopinau kodą (tą dalį kur su registrais PWM dažnis išgaunamas) iš roboto-skraiduolio reversinio valdymo schemos, maniau, kad ji veikianti, juo lab, kad ir klipas yra kaip jis skraido . Gal tyčia kokių lepų įkišo.
Bet nežiūrint to PWM generacija yra būtent tokia kokios reikia ir reguliuojasiaip kaip esu pasirašęs, visa kita jau mano autorystė.
Socrates rašo: |
O siaip del bendros kulturos, kiekvienas kintamuju priskyrimas turi buti naujoje eiluteje. Pratinkis dabar, nes jei teks dirbti kokioje rimtesneje kompanijoje, tai kodo tikrinimo irankiai tokio dalyko nepraleis. Pvz.:
Kodas: |
if (MotorSpeed > 0) {
MotorSpeed = MotorSpeed - 50;
lcd.setCursor(10,1);
lcd.print(MotorSpeed);
}
|
|
Na nesibark, dėl kultūros, kitą kartą patvarkysiu, kaip dera, nes kadangi sau rašiau, tai man lengviau taip skaitosi ir visokių kabliukų skliaustukų nepametu
Rimtesnėje kompanijoje (nei dabar) turbūt jau nebeteks dirbti. Senas perdalius jau niekam nebeįdomus ir juolab kaip "ale programuotojas"
Na gerai grįžtame prie kodo tai gal ten ir turi būti "mažiau", o ne "mažiau arba lygu" nesupratau ką norėjote pasakyt. |
|
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 14:02 |
|
|
|
Ok, reikia pasinagrineti koda.
Kaip suprantu pradeda neveikti po to, kai keleta kartu paspaudziamas skaicius 7?
Jei po paleidimo paspaudi tris kartus skaiciu 7, tai nuo to laiko ir uzstringa? |
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 14:24 |
|
|
|
Taip kai pasiekia 500 ribą ir PWM generacija sustoja ir spaudant 1 MotorSpeed skaičiukai keičiasi, bet PWM - ne. |
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 14:31 |
|
|
|
ewas rašo: |
Taip kai pasiekia 500 ribą ir PWM generacija sustoja ir spaudant 1 MotorSpeed skaičiukai keičiasi, bet PWM - ne. |
Taigi ka as ir minejau apie salyga "daugiau arba lygu". Dabartineje situacijoje pas tave yra tikrinimas, ar registro reiksme yra maziau, negu 500.
Taigi tu paleidi programa, kurioje priskiri MaxSpeed reiksme 350. Po triju paspaudimu, tavo MaxSpeed tampa lygus 500. Si reiksme taip pat priskiriama PWM registram, todel kai tu jau tikrini ar reiksme yra mazesne uz 500, tai atsakymas beabejo ne. Tau reikia tikrini ar reiksme mazesne arba lygi 500. |
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 16:23 |
|
|
|
Sutinku, bet tada kita dar mintis, kad reiktų uždrausti reikšmę didinti virš 500 nes, gerai jei 500 ir sąlyga <= tenkinama, o jei 600, 700.
if (MotorSpeed>500) { MotorSpeed==MotorSpeed;}
turbūt nusišnekėjau. Neturiu kaip pabandyti. |
|
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 17:06 |
|
|
|
ewas rašo: |
Sutinku, bet tada kita dar mintis, kad reiktų uždrausti reikšmę didinti virš 500 nes, gerai jei 500 ir sąlyga <= tenkinama, o jei 600, 700.
if (MotorSpeed>500) { MotorSpeed==MotorSpeed;}
turbūt nusišnekėjau. Neturiu kaip pabandyti. |
Nelabai supratau, ka cia norejai padaryti, bet tau pravartu butu ismokti apriboti reiksme iki tam tikro skaiciaus. Tas dalykas vadinamas bitu maskavimu (eng. bit mask), pasiskaityk apie tai. Siuo atveju uzmaskaves bitus susidursi dar ir su kita problema, bet paliksiu issiaiskinti paciam
Kitas variantas yra tiesiog pastoviai tikrinti ar tavo skaiciuojama reiksme perlipa per nustatyta riba ir jei taip, tai kintamojo reiksme nustatyti lygia ribai.
Tarkim max = 500.
if (var > 500) var = max; |
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 17:29 |
|
|
|
Mano nuomone tai geriau pradėti mokytis nuo nulio, o ne kopypastinant svetimą kodą ir poto bandytis aiškintis kaip jis veikia. |
|
|
|
|
|
Su PWM valdymu nesusitvarkau |
Parašytas: 2014 10 28, 22:50 |
|
|
|
Socrates rašo: |
Taigi ka as ir minejau apie salyga "daugiau arba lygu". Dabartineje situacijoje pas tave yra tikrinimas, ar registro reiksme yra maziau, negu 500.
Taigi tu paleidi programa, kurioje priskiri MaxSpeed reiksme 350. Po triju paspaudimu, tavo MaxSpeed tampa lygus 500. Si reiksme taip pat priskiriama PWM registram, todel kai tu jau tikrini ar reiksme yra mazesne uz 500, tai atsakymas beabejo ne. Tau reikia tikrini ar reiksme mazesne arba lygi 500. |
Dėkui suveikė perrašius "<=" be jokių papildomų fintų, gal kas ir "nešvaru" bet pradžiai veikia "patobulėsiu" prišlifuosiu. |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|