ATMEGA328 1/2/4/8 hertz

Ik heb op de PWM pin van een ATMEGA328 een CD4060 aangesloten, er komt netjes een signaal uit van rondom de 1 hertz, alleen wordt de duty cycle
niet overgenomen, het signaal is 50/50.
Welk IC kan wel de frequentie delen met behoud van de duty cycle ?
Ik wil wel de ATMEGA blijven gebruiken.

Hallo Ireric. Dit kan je toch gewoon in de firmware oplossen. Als je voor compareA en compareB een interrupt routine aanvraagt. I.p.v. de pwm functie te gebruiken dan ben je toch vrij om de frequentie terug te brengen naar bijv. 1 Hz.

Volgens mij bestaan er geen logische ic's die dat kunnen.
Uwe ATmega kan dat wel, pwm uitgang terugkoppelen.

LDmicro user.

Snel en zot ideetje, je kan 1 ingang van een AND gate aansluiten op de uitgang van je 4060 en de 2de ingang aan je clock-in signaal. Of pen 9/10 van de 4060.

Groetjes,
eSe

Het jammerlijkste aspect van het leven nu is dat de wetenschap sneller kennis vergaart dan de maatschappij wijsheid. Asimov, Isaac

Ik gebruikte daar vaak een 4019 voor...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

@eSe, Arco, hoe doen jullie dat, bv. 1kHz 20%duty naar 1Hz 20% duty cycle.

LDmicro user.

Ik bedoel overname van de originele duty-cycle pulsduur, niet de pulsverhouding...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Dat is niet wat hij vraagt, daarom zei ik dat zo'n logic ic niet bestaat.

LDmicro user.

Ah,

Dat kan inderdaad niet. Zal in software moeten gebeuren...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

En of dat kan! Je kunt een timer van een input clocken, met een periode van 1000 en een compare value van 200. Je software hoeft daarna niets meer te doen, dus je hebt ook geen interrupt latency of zo, de hardware van je timer periferal doet het helemaal zelf. Als je de pulsbreedte moet gaan volgen wordt het natuurlijk wat lastiger, die moet je dan eerst meten, met een input capture, of door hem te filteren en de uitgang van dat filter analoog te meten. Daar zit dan uiteraard wel weer software tussen, maar die hoeft alleen de duty cycle aan te passen.

Als het echt snel of nauwkeurig moet zou ik een CPLD pakken; met een teller tel je de inkomende pulsen, een met een tweede teller met de ingang als gate tel je de Roosje tijd dat het signaal hoog was sinds de laatste reset. Bij een totaal van 1000 reset je de beide tellers en begin je de puls aan de uitgang, voor een periode gelijk aan de som van de laatste 1000 pulsen, dat zat in de tweede teller. De pulsbreedte verhouding is dan (afgezien van afrondingsfoutjes) gelijk aan de gemiddeld pulsbreedte van de ingang.

Dit werkt alleen als de variatie van de ingangsfrequentie niet te groot is.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

@SparkyGSX, een doodgewone (N)AND achter zijn 4060 en een ATmega geprogrammeerde uitgang kan hij de dutycycle regelen.

Hij zal sowieso moeten programmeren.

LDmicro user.

De hele 4060 kan weg, maakt de boel alleen maar ingewikkelder. Alles in software kan heel erg simpel.
Zeker omdat alles nette verhoudingen tot elkaar heeft... (1:2:4:8)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

ireric, Je hebt kennelijk een probleem waar je denkt dat die 1Hz PWM een oplossing voor zou zijn. Je hebt een oplossingsroute geprobeerd: de 4066 op de PWM uitgang en dat werkt niet zoals je gehoopt had. Het werkt wel zoals de rest verwacht dat het werkt: Op de opgaande flank van het clock signaal telt de teller verder en alle deeltallen zijn dan 50/50 aan dutycycle.

Nu kunnen we hier allemaal kunsteloplossingen gaan verzinnen die wat jij probeerde te bereiken proberen te benaderen. Maar dan krijgen we weer een heel ge-heen-en-weer met: Maar dat werkt niet want....

Dus: Omschrijf je probleem en leg uit waarom jou idee een oplossing zou zijn voor jou probleem.

Zoals diverse mensen voor me: een microcontroller kan prima "software only" een 1Hz PWM signaal maken. Dit kan op diverse manieren.

De prescaler van de timers in de arduino kan je instellen zodat de timer langzamer loopt dan normaal. Of dat ver genoeg gaat weet ik niet uit m'n hoofd.

Als de frequentie laag genoeg is, dan kan je het makkelijk gewoon helemaal in software doen.

c code:

ISR (TIMER1_COMPA_vect)
{
  static int tt;

  if (tt > 998) tt=0;
  else          tt++;
  digitalWrite (pwmpin,  (curpwm > tt));
}

Laat dit 1000 x per seconden lopen en je hebt je 1Hz pwm met 1000 resolutie. (met voor curpwm de mogelijkheden 0 tot en MET 1000 voor altijd uit tot en met altijd aan: dat kan niet altijd!).

En een andere oplossing: Gebruik een STM32. Die heeft timers met PWM uitgangen die makkelijk 1Hz aan moeten kunnen. (zo nodig draai je bijvoorbeeld de timer op 1MHz, gebruik je een 32-bit timer, zodat je met een timer-reset op 1 miljoen een 1:1000000 resolutie krijgt!).

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Code voor 4 uitgangen stelt weinig voor. Aanroepen in een timerinterrupt op (1/2048 sec). Duty is duty-cycle (0...255)
PwmOutx zijn de output pinnen. Voorbeeld (8 bit PWM) voor pic/mikrobasic (niet getest):

pic basic code:


  Dim Cnt, Duty As Word
  ...
  Cnt = (Cnt +1) And 0x7FF
  PwmOut1 = ((Cnt And 0x7FF) < (Duty << 3))
  PwmOut2 = ((Cnt And 0x3FF) < (Duty << 2))
  PwmOut4 = ((Cnt And 0x1FF) < (Duty << 1))
  PwmOut8 = ((Cnt And 0xFF)  < Duty)
  ...
  
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com