• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Licznik wypełnienia PWN AtMega8

Object Storage Arubacloud
0 głosów
293 wizyt
pytanie zadane 30 marca 2022 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)
edycja 30 marca 2022 przez Mavimix

Chcę napisać program (na atmega8) liczący wypełnienie zewnętrznego sygnału PWM w milisekundach. Nie mam pomysłu jak to zrobić, na razie udało mi się liczyć częstotliwość PWN, a nawet nie częstotliwość, bo po prostu skonfigurowałem licznik aby się inkrementował przy zboczu narastającym zewnętrznego sygnału. W jaki sposób mogę wyłuskać z tego czas wypełnienia? Czy muszę do tego użyć jeszcze jednego licznika który będzie liczył ten czas? Macie jakieś pomysły?

Dotychczasowy kod:

#ifndef __AVR_ATmega8__
#define __AVR_ATmega8__
#endif

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>

void print_char(char letter)
{
   ...
}

void print_newLine()
{
    ...
}

void uartInit()
{
    ...
}

void generatorInit()
{
    TCCR1A |= (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
    TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);

    //ICR1 = (F_CPU/64UL/50UL)-1;
    ICR1 = 200;
}

void counterInit()
{
    TCCR0 |= (1<<CS02) | (1<<CS01);
    TCNT0 = 0;
}

int main(void)
{
    //PD4 polaczone z PB1

    uartInit();

    //Generowanie sygnalu do testow
    generatorInit();

    //Konfiguruj licznik impulsow
    counterInit();

    while(1)
    {
        char str[5] = {0,0,0,0,0};

        //Roboczo wyswietl na ekranie wartosc rejestru TCNT0
        sprintf(str, "%d", TCNT0);

        for (int i = 0; i < 5; i++)
        {
            print_char(str[i]);
        }

        print_newLine();

        _delay_ms(500);
    }
}

 

1 odpowiedź

0 głosów
odpowiedź 30 marca 2022 przez adrian17 Ekspert (344,860 p.)

Musisz konkretniej napisać co robisz, jaką konfigurację PWMa używasz, po w ogóle co liczysz wypełnienie w ms (np w moim zastosowaniu sterowania silnikiem nie musiałem o tym myśleć, tylko o % wypełnienia).

Przy niektórych konfiguracjach to jest zwykła bezpośrednia matma, na przykład przy konfiguracji:

>Fast PWM mode, 8-bit

>Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM, (non-inverting mode) (...) If TCNT equals OCR1x the comparator signals a match. A match will set the Output Compare Flag (OCF1x) at the next timer clock cycle.

>Timer clock: clk(I/O)/64 (From prescaler)

>F_CPU=1MHz

To licznik inkrementuje się o 1 co 64 mikrosekund. Więc ustawiając OCR1A na wartość X między 0 a 255 dostaję jednorazowe wypełnienie (X+1)*64 mikrosekund, a pełny cykl trwa 256*64==16.384 milisekundy. (ze sczególnym przypadkiem dla X==0: "the output will be a narrow spike for each TOP+1 timer clock cycle")

...przynajmniej tak na szybko mi wyszło z datasheeta i pamięci :) Nie jestem pewny tego (X+1) czy po prostu X.

komentarz 30 marca 2022 przez Mavimix Dyskutant (8,390 p.)
Zapomniałem o słowie klucz w pytaniu ("liczący wypełnienie zewnętrznego sygnału PWM"), już poprawione. Dodałem kod który mam na razie. Długo by tłumaczyć czemu potrzebuję mieć czas wypełnienia zewnętrznego sygnału PWM, więc uznajmy że po prostu go potrzebuje :P
komentarz 30 marca 2022 przez adrian17 Ekspert (344,860 p.)
ah :)
komentarz 30 marca 2022 przez Mavimix Dyskutant (8,390 p.)
Jakieś pomysły?
komentarz 30 marca 2022 przez Oscar Nałogowiec (29,290 p.)
ICP - taka funkcja timera, że na zbocze sygnału wejściowego powoduje zapamiętanie wartość licznika i zgłasza przerwanie. Timer puszczasz na "wolny bieg", w przerwaniach czytasz rejestr ICP i obliczasz różnicę pomiędzy aktualną i poprzednią wartością. Dostaniesz czas trwania sygnału wysokiego i niskiego - a więc parametry PWM.
komentarz 30 marca 2022 przez Mavimix Dyskutant (8,390 p.)
Czyli de facto muszę zrobić:

1.Skonfigurować i uruchomić licznik wewnętrzny

2. Skonfigurować drugi licznik do funkcji ICP

3. W przerwaniu ICP liczę różnicę między rejestrem licznika wewnętrznego i rejestrem ICP i mam czas trwania stanu wysokiego na PWM? Bo właśnie średnio rozumiem jak to działa - różnica wartości poprzedniej i aktualnej rejestru ICP nie będzie 0?
komentarz 30 marca 2022 przez Oscar Nałogowiec (29,290 p.)
edycja 30 marca 2022 przez Oscar
Różnica pomiędzy wartością rejestru ICP a wartością tego rejestru zapamiętaną podczas poprzedniego przerwania. Trzeba ją gdzieś zapamiętywać, w jakiejś zmiennej (volatile).

ICP to Input Capture Register - taki mechanizm złapania dokładnego (na ile się da) momentu gdy na wejściu ICP wystąpiło zbocze. "Obudowane" odpowiednim programem z przerwaniami umożliwia w sumie dowolne zanalizowanie przebiegu cyfrowego na wejściu ICP. Najczęściej stosowane do odbioru sygnałów z odbiornika pilota IR.

To w sumie jest proste - licznik timera sobie liczy, najlepiej w pełnym zakresie, z częstotliwością zapewniającą odpowiednią rozdzielczość czasową. W momencie wykrycia zbocza od razu sprzęt przepisuje aktualną zawartość licznika timera do dedykowanego rejestru - skąd można ją sobie odczytać, już bez wielkiego pośpiechu. O ile kod wyrobi się pomiędzy jednym zboczem a drugim oczywiście. Różnica pomiędzy kolejnymi odczytami rejestru ICP to czasy poszczególnych faz/okresów sygnału (zależnie na jakie zbocza ustawimy mechanizm).

 

To trochę tak, jakbyś w momencie zmiany sygnału na wejściu robił zdjęcia zegara.
komentarz 31 marca 2022 przez Mavimix Dyskutant (8,390 p.)
Spróbuję napisać jakiś program i dam znać

Podobne pytania

0 głosów
1 odpowiedź 1,856 wizyt
pytanie zadane 27 maja 2016 w Mikrokontrolery przez Mateusz Dziewior Początkujący (250 p.)
0 głosów
0 odpowiedzi 390 wizyt
0 głosów
2 odpowiedzi 702 wizyt
pytanie zadane 6 lutego 2020 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)

92,554 zapytań

141,399 odpowiedzi

319,536 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...