[BASCOM] PWM i ADC - ATtiny13

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
FireIsland
-
Posty: 36
Rejestracja: 07 lis 2013, 20:58
Lokalizacja: Grybów

[BASCOM] PWM i ADC - ATtiny13

Post autor: FireIsland » 15 mar 2017, 21:15

Dzień dobry,

Potrzebuje wykonać prosty układ sterujący tranzystorem MOSFET na procesorze ATtiny13. Na wejście przetwornika ADC podaję napięcie z potencjometru 2k, na wyjściu PWM0A chcę otrzymać sygnał z zakresu 0-5V do sterowania bramką tranzystora.

Timer w tym procesorze jest 8 bitowy a przetwornik ADC 10bitowy, więc sygnał z przetwornika dzielę przez 4 aby "zmieścił się" w zakresie 0-255.
Z racji małego procesora zmienne umieściłem w rejestrach roboczych.
Problem jest taki, że przekręcając potencjometrem raz od jednego końca do drugiego, dioda (którą podłączyłem do wyjścia w celach testów) zaświeca się i gaśnie 4 razy. A powinna rozjaśniać się od 0 do swojej maksymalnej jasności. Pomiary napięcia na wyjściu wykazały że dochodzi ono do ok. 1V po czym spada do 0. To logiczne gdyby napięcie odniesienia było ustawione na wewnętrzne 1.1V. Lecz tutaj jest ustawione na Vcc więc powinno wynosić w okolicach 5V. Zachowanie to nie dziwiło mnie gdy nie miałem linijek odpowiedzialnych za dzielenie przez 4. Przy braku dzielenia na wyjście jest cztery razy podawany sygnał od 0 - 255 przy jednym obrocie potencjometru. Nie rozumiem dlaczego dzielenie przez 4 nie pomaga.
Podobny program wgrałem na ATmega32A. Rozdzielczość timera ustawiłem na 8bit a przetwornik ADC jest 10 bitowy. Sytuacja wyglądała podobnie. Dioda rozjaśniała się czterokrotnie, przy jednym obrocie potencjometru. Pomogło wstawienie linijek dzielących wartość z ADC przez 4. Nie wiem dlaczego dzielenie nie pomaga w przypadku procesora ATtiny. Domyślam się, że jest jakiś problem ze zmiennymi.

Z góry dziękuję za odpowiedzi. Poniżej załączam kod programu.
Pozdrawiam Piotr,

[hide]$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 40
$swstack = 16
$framesize = 8

Config Pinb.4 = Input
Set Portb.4
Config Pinb.0 = Output
Config Pinb.3 = Output

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Prescale = 1

Dim A As Iram Word At 15
Dim B As Iram Byte At 10

Start Adc

Do

A = Getadc(2)
B = A / 4
Pwm0a = B

Loop
End
[/hide]

Jony130
Moderator
Posty: 3069
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 16 mar 2017, 16:23

Ten sobie program wykorzystaj.
Potencjometr pod PB4 a wyjście to PB0

Kod: Zaznacz cały

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 40
$swstack = 16
$framesize = 8

Config Pinb.0 = Output

'Konfiguracja PWM w trybie szybkimi (fast PWM mode, 0 do 255 i odnowa), wyjscie PWM OC0A (PB0)

Tccr0a = &B10000011       'Zeruje OC0A (PB0) przy zrownaniu (Clear Up),                                                                                                                                          

Tccr0b = &B00000001       'Bez Preskalera (CLK/1)

' <----Konfiguracja ADC------->

Didr0 = &B00010000        ' Wyłaczamy wejście cyfrowe na PB4

Admux = &B00100010      ' Vcc jako Vref, tryb ADC 8 bitowy i PB4 jako wejście                                        

Adcsra = &B11101000       ' ADC_ON , Free running mode, Preskaler = (CLK/2)

Adcsrb = &B00000000       ' Tryb Free running mode

On Adc Adc_int
Enable Interrupts

Do
Loop

Adc_int:
Ocr0a = Adch
Return
Bo nie chce mi się twojego kodu analizować. Szczególnie że dawno już Bascoma nie używałem.

ODPOWIEDZ