[C] Generátor pilového průběhu - D/A převodník na AT89S52

Ahoj,
chci se zeptat jak lze v C zapsat (vytvořit) generátor pilovitého průběhu (pomocí cyklů) s využitím přípravku D/A převodníku? Jenočip: AT89S52.

Díky

:arrow_right: administrator: přejmenováno z "[C] Generátor pilového průběhu"

Když nevíme, jak onen přípravek vypadá a jak je připojen, tak blbě.
Pokud to bude paralelní převodník na některém portu, tak stačí v cyklu do proměnné přičítat číslo a neustále ho posílat na port. Aby ses na to mohl koukat (aby to jelo dostatečně pomalu), je třeba po každém zápisu na port počkat.

Taky to lze vytvořit z obdélníku pomocí integrátoru (jeden OZ s kondem ve zpětné vazbě). Obdélník ti vygeneruje MCU. Záleží na co to má být, protože způsobu je několik a každý z nich má své plusy a minusy.

no měl by to generovat přímo mikročip. Schéma zapojení převodníku přikládám. Když budu vysílat číslo nebude to obdélníkový průběh?
DAC.png

Bude to schodovitý průběh, ostatně jako na výstupu každého DA převodníku. Ikdyž v tomhle zapojení by C4 a C5 mohly ty skoky omezit. Záleží na velikostech. S tím nic neuděláš.

potřebuju právě v C naprogramovat pilu

ten procak nema PWM ? ozaj o akej frekvencii tej pily s abavime ?

frekvence libovolna, nastavitelna…mělo by to byt pouze napsáno v programu pomoci cyklu nic vic

Znamená to od 0 Hz až po 5 THz? Při nízkých kmitočtech budeš mít schodišťový průběh, zatímco při vysokých se ti uplatní časová konstanta C4*R6 takže průběh už nebude pila, ale cosi mezi pilou a sinem. Mimochodem dioda D2 je nakreslana obráceně.

Pokud nechceš prozradit k čemu to má být, měl bys přesněji specifikovat požadavky na výsledný průběh, jako např. procentuálná odchylku od ideální pily, chvění hran (jitter) z toho vyplývjící fázový šum, stabilitu frekvence a amplitudy a hlavě frekvenční rozsah.
U MCU zejména u řady x51 je obtížné ba nemožné zajistit přesné časování výstupních operací (zápis do portu se může náhodně zpozďovat o několik us v důsledku přerušení) a proto se používá latch (např. 574) pro přesné předávání dat do DA, aby se eliminoval fázový šum. Pro řízení latche je nutné mít hw děličku, která současně řídí tok dat do DAC. x51 tím nedisponuje na rozdíl od AVR.
Pokud jitter řádově několika us nevadí, nemá smysl komlikovat HW. Nicméně to znamená dělat časovaou analýzu všech přerušení právě pro odhad jitteru nebo napsat program bez přerušení jen pro generování pily, ale pak mi není jasné , jak se ten program bude řídit.

potřebuji čiste jen program, neco uplně základního nic složitéh - nejsem žádný odborník. Požadavky na průběh nebyly definovány. Vlastně vše co vím jsem už napsal. Vic zadané nebylo.

V čem je problém? Jak to jednoduše udělat máš už ve druhém postu.

Samozřejmě, že na výstupu mcu bude obdélník (na různých bitech odlišný), co také jiného. Ovšem na výstupu DA už bude schodovitý průběch s pilovitou obálkou, nebo něco, co se tomu bude více či méně blížit. Programově se s tím nedá nic jiného dělat. Moc nad tím přemejšlíš a hledáš problémy kde nejsou.

Tak pro uplnost toto sem chtel: :slight_smile:

#include <at89x52.h>
#define T0_M 0
#define T0_CNT 2
#define T0_G 3
#define HM 255  
#define DM 128        //definice spodni meze

unsigned int i;    // nezaporne cele cislo, ktere bude jakoby tancit po tom prubehu
void cas () interrupt 1  //  definice aby to byl interupt    prazdna zavorka nazev   interupt vyvolava prerus  jen kdyz dojde k preruseni je vyvolana
{
TR0=0;        //vypnu timer
TL0=255;   //definice sirky schodku
TH0=250;     //definice sirky schodku
TR0=1;         //zapnu timer

if (i==HM)   // kdyz zjisti ze icko je nahore HM tak zapise nulu
{ i=DM; 
}
else
{ P0=i;
++i;
}
}

void main ()
{
  TMOD=0<<T0_G|0<<T0_CNT|1<<T0_M;    //| - zaroven
  TR0=1;
  TL0=255;        //zapisu prvni hodnoty
  TH0=250;
  ET0=1;              //povoleni od timeru nula preruseni
  EA=1;
  i=DM;    // kde ma zacit citat ... takze od nuly
  while (1);