Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

Probleem impulsslaiusmodulatsiooniga kasutades 16-bitist taimer-loendurit (ATmega162)

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    Probleem impulsslaiusmodulatsiooniga kasutades 16-bitist taimer-loendurit (ATmega162)

    Tekkis vajadus programmijupi järele, mis tekitaks impulsslaiusmoduleeritud signaali. Seejuures peaksid olema nii sagedus kui ka suhteline lülituskestus muudetav. Et prescaler-st jääb sageduse muutmisel väheks ning võimalusel väldiks ka katkestusi taimer-loenduri "TOP"-väärtuse saavutamisel (katkestuse mõte seisneks mingisuguse väärtuse registrisse TCNTn kirjutamises vähendades antud viisil loendamise ulatust, mis omakorda suurendab PWM sagedust), oli plaanis kasutada 16-bitise taimer-loenduri registrit ICRn "TOP"-väärtuse omistamiseks.

    Kirjutatud katse- ja kontrollotstarbeline programm on alljärgnev.

    .include "m162def.inc"

    .def Temp = r16
    .def Temp1 = r17

    .org 0x0000
    rjmp Reset

    Reset:
    sbi DDRD, 5

    ldi Temp1, 0b00000000
    ldi Temp, 0b11001100
    out ICR1H, Temp1
    out ICR1L, Temp

    ldi Temp, 0b11000010
    ldi Temp1, 0b00000000
    out OCR1AH, Temp1
    out OCR1AL, Temp

    ldi Temp, 0b11000010
    out TCCR1A, Temp
    ldi Temp, 0b00011001
    out TCCR1B, Temp

    rjmp Loop

    Loop:
    rjmp Loop

    Lähtudes bittidest WGMn3:0 = 0b1110 peaks taimer-loendur lugema alates väärtusest "0" ("BOTTOM") kuni väärtuseni, mis paikneb registris IRC1L ("TOP" vastavalt tabelile "Waveform Generation Mode Bit Description", tabel 56, ATmega162 andmelehel) ning jätkama uuesti väärtusest "0". AVRStudio (ver. 4.12) simulatsioon aga näitab, et loendamine toimub väärtuseni 0b111111111 ning sealt tagasi nulli.

    Antud toime vastab režiimile "PWM, Phase Correct, 9-bit" (WGMn3:0 = 0010). Seadistades bitid WGMn3:2 nulliks töötab programm vastavalt andmelehel kirjeldatule.

    Kas on midagi olulist programmist välja jäänud (ehkki olen kasutatud registrite sisu mitu korda üle kontrollinud, ei välistaks ka "inimlikku süstemaatilist viga") või tõesti simuleerib AVRStudio vigaselt?

    Kui kellelgi on ka mõistele timer/counter parem eestikeelne vaste kui "taimer-loendur", siis ei ütleks ka selle teada saamisest ära...
    Öeldakse: "Esialgsed operatsioonilised testid olid ebaveenvad..."
    Seejuures mõeldakse: "Pauk käis, kui sisse lülitasime..."

    #2
    Vs: Probleem impulsslaiusmodulatsiooniga kasutades 16-bitist taimer-loendurit (ATmega

    Kokkuvõtteks võib öelda, et vist ongi probleem simulaatoris.

    Kontrollimisel kasutades vastavat programmi, R/2R baasil D/A-muundurit (taimer-loenduri väärtuste kirjutamine väratisse C) ja ostsilloskoopi, oli näha, et WGM3:0 olekus 0b1110 oli tõesti tegu Fast PWM-ga (hoolimata AVRStudio simulaatorist, mis väitis midagi muud) ning IRCnL muutmine muutis ilusti "TOP"-väärtust. Ka teised pisteliselt valitud režiimid ning nende kirjeldused olid vastavuses.

    Ehkki tõusvad (ja osadel režiimidel ka langevad) rambid ei olnud ühtlaselt "siledad" (neis esines "äkilisi" muutusi, nagu oleks taimer-loenduri väärtus mingil hetkel rohkem kui ühe võrra muutunud; mõlemasuunalised muutused nii tõustes kui ka langedes), võib vist esialgse probleemi lahendatuks lugeda.

    Terviklikkuse huvides siiski ka katked viimase testprogrammi koodist (n on katsetuste käigus muudetud 1 või 0)...

    ;...
    ldi Temp1, 0b00000000
    ldi Temp, 0bnnnnnnnn
    out ICR1H, Temp1
    out ICR1L, Temp
    ;...
    ldi Temp, 0b110000nn
    out TCCR1A, Temp
    ldi Temp, 0b000nn010 ;Tegelikult isegi 0b000nnnnn
    out TCCR1B, Temp
    rjmp Loop

    Loop:
    in Temp2, TCNT1L
    out PORTC, Temp2
    rjmp Loop
    Öeldakse: "Esialgsed operatsioonilised testid olid ebaveenvad..."
    Seejuures mõeldakse: "Pauk käis, kui sisse lülitasime..."

    Comment

    Working...
    X