Impulzus, kitöltési tényező generátor

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
POSSIM
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2020. május 16. szombat, 20:28

Impulzus, kitöltési tényező generátor

Hozzászólás Szerző: POSSIM »

Sziasztok!
Szeretnék segítséget illetve tanácsot kérni egy projekthez.

A következőt szeretném hardwaresen megvalósítani: (bascom 2.0.7.8, atmega328) Adott egy kimenet jelenesetben Portb.2( OC1B ) , amin a kimenetet tudom állítani a frekvenciát(1-100Hz) és a kitöltési tényezőt (1-99%) a mindenkori frekvencia mellett.

Hogyan lenne célszerű megvalósítani ezt a feladatot?

Üdvözlettel:
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Impulzus, kitöltési tényező generátor

Hozzászólás Szerző: Robert »

A PWM esetén csak fix leosztásod van az órajelből.
- tudsz számolni 0... TOP értékig (TOP általad állatható felső érték) -> ez adja a frekvenciát
- 0... TOP ezen belül állíthatod a PWM kitöltési tényezőt - de ha a 0...TOP az mondjuk úgy van állítva hogy 0...10, akkor 10%-os lehet csak a lépésközöd!

A feladat ez alapján:
1, A frekvencia ismeretében a legnagyobb TOP értéket érdemes választani és az előosztást is ennek megfelelően beállítani
2, Az OC1B jó kimenet, mert a belső TIMER1re van drótozva, ott 10/11/12 bites direktPWM is van , meg a TIMER1 is 16 bites.
3, kitöltési tényező a 0-100 leképezése a 0...TOP tartományra.
4, Timer INDÍT
5, főprogram, egyebek....

http://ww1.microchip.com/downloads/en/D ... asheet.pdf
Bascom alól ezt csak direkt regiszterhívásokkal lehet megtenni. Las az adatlap TIMER része.
http://www.tavir.hu - a gazda :)
POSSIM
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2020. május 16. szombat, 20:28

Re: Impulzus, kitöltési tényező generátor

Hozzászólás Szerző: POSSIM »

Köszönöm a választ!
Végre van időm ismét foglalkozni a dologgal.
Szóval... már az elején elakadok, mármint nem tudom életre kelteni magát a timert sem a regiszterek beállításával.
A 328-as datasheetjének 109. oldalán van egy táblázat ami alapján lehet állítgatni a timer funkciókat. Én 14 illetve a 15 módjával próbálkoztam, ahol a kívánt frekvenciát icr1 illetve ocr1b -vel tudnám állítani a kitöltési tényezőt pedig pwm1b értékadással ha jól gondolom. Viszont akármit írok be a regiszterekbe nem indul el a timer. Bemásolom a program részletet:

$regfile = "m328pdef.dat"
$crystal = 8000000

'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 256' ez csak próba volt hogy ezzel megy e egyáltalán

tccr1a=&b10100010
tccr1b=&b00011100
tccr1c=&b00000000
timsk1=&b00000111
tifr1=&b00100111

icr1=40000 ' ez lenne az ami a frekit meghatározza
pwm1b=50 ' ez pedig a kitöltési tényező

enable timer1
start timer1

Config Portd.1 = input 'enkóder
config int0=FALLING,nosave 'enkóder int0
enable int0
on int0 isr0

enable interrupts

do
loop
stb...

Kérlek nézzetek már rá , hogy mit rontok el. Köszönök minden választ
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Impulzus, kitöltési tényező generátor

Hozzászólás Szerző: Robert »

Tipp: bascom szimulátorban nézd meg hogy a TIMER regiszterek tényleg beállnak-e. Illetve a config TIMER1= sorral fordítva is hogy áll be...
http://www.tavir.hu - a gazda :)
POSSIM
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2020. május 16. szombat, 20:28

Re: Impulzus, kitöltési tényező generátor

Hozzászólás Szerző: POSSIM »

Köszi a tippet, ez eszembe se jutott , mármint a szimulátor.
Szóval Config timer -el a TCCr1a és TCCr1b Tifr1 Timsk1 beáll a konfigolás szerint, viszont a regiszterek közvetlen írásával a TCCr1bés a TCCr1c nem íródik beléjük semmi , mármint csak a nulla H00. Ilyenkor mit lehet tenni vagy mi lehet a baj?
POSSIM
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2020. május 16. szombat, 20:28

Re: Impulzus, kitöltési tényező generátor

Hozzászólás Szerző: POSSIM »

Sziasztok!

Megírom, mert sikerült rájönnöm, hogy miért nem indult el a timer1-em.

Ahogyan írtam korábban , hogy a TCCR1A-t sikeresen értéket tudok adni, viszont a TCCR1B-C-t ahol a prescalet, módokat, stb-t lehet beállítani 0 értéket vesznek fel.

A probléma ott volt, hogy ezek után engedélyeztem és indítottam a timert (enable timer1, start timer1), addig próbálkoztam szimulátorral, hogy végül kiderült számomra , hogy ez a két sor írja át a B és a C regisztert. Elhagytam a start és az enable timert és egyből működött.

Robi köszönöm szépen a segítséged!

config PORTD.4=input 'encoder

config int0=FALLING,nosave
enable int0
on int0 isr0

config int1=FALLING,nosave
enable int1
on int1 isr1

tccr1a=&b00100010
tccr1b=&b00011100

icr1=&h7a11

Config Portb.2 = Output ' LED
config PORTD.5=INPUT ' on/off
config PORTD.6=INPUT 'kitöltés/ frekvencia

enable interrupts

dim frequency as integer
dim duty as integer
dim enc_tact as bit 'kitöltés/ frekvencia
dim c as bit ' oled szubrutn bit
dim enable_out as bit
c=0
declare sub oled
'Call Lcd_clear(black)
'Restore Pic1
'Call Lcd_show_bgf(1 , 0)
'Call Lcd_show()

Call Lcd_box(1 , 25 , 128 , 64 , 0 , White)
Call Lcd_line(1 , 40 , 128 , 40 , 1 , White)
Call Lcd_line(64 , 40 , 64 , 64 , 1 , White)

Call Lcd_text( "Frequency" , 5 , 30 , 1)
Call Lcd_text( "DutyCycle" , 70 , 30 , 1)
Call Lcd_show()

oled


do

if c=1 then oled

Loop

isr0:
waitms 100
toggle enc_tact
return

isr1:

if enc_tact=0 then

if pind.4=1 and pind.3=0 then
incr frequency

if frequency>99 then frequency=99
else
decr frequency

if frequency<1 then frequency=1

end if

end if

if enc_tact=1 then

if pind.4=1 and pind.3=0 then
incr duty
if duty>99 then duty=99

else
decr duty
if duty<1 then duty=1

end if

end if
icr1=31249/frequency
pwm1b=icr1/100
pwm1b=pwm1b*duty
c=1


return
Válasz küldése