Op 10 november 2003 13:55:59 schreef Benadski:
Geen idee of het werkt... Ben niet zo'n C gebruiker/liefhebber.

Wat ik meestal doe is gewoon 1 hardware teller laten lopen. Elke keer vergelijk ik elke PWM waarde met die teller. Als de waarde groter is dan de tellerstand dan laat je de uitgang hoog zijn en anders laag. Zo kan je dus makkelijk 32 PWM uitgangen sturen en heb je nog zat tijd over voor andere dingen. :)

Als je het geheel met timerinterupts laat werken, dan is het trouwens veel stabieler.

Dat is dus bijna hetzelfde als wat ik doe, alleen dan andersom omdat mijn poorten niet inverse zijn. Ik zal alleen een teller moeten gaan gebruiken in plaats van een delay van 10ms?

Zoja, op hoeveel ms laat jij die teller aflopen?

Alvast bedankt :)

De clock van de teller laat ik meestal op ongeveer 50kHz lopen als ik LEDs gebruik. Dan knipperen de LEDs ongeveer op 200Hz, dat ziet het oog niet meer. Voor motoren kun je dit ook wel gebruiken denk ik...

De totale tellertijd (wanneer een overflow interrupt word gegeven) is ongeveer 5ms, de tijd per tel is ongeveer 20us.

EDIT: Ik laat meestal de teller tot 255 lopen, dan heb je meer stapjes. Het kan natuurlijk ook gewoon tot 100 of lager, dat is een keuze die je zelf maakt.

[Bericht gewijzigd door Benadski op ]

Nu snap ik er helemaal niets meer van. Ik snap wel hoe PWM werkt, maar zoals julie hem aansturen niet (niet meer thans :)) PWM = pulse width modulation = duty cycly laten veranderen, correct?
(frequentie blijft gelijk)

Maar hoe veranderen julie de pulse width dan adh van de timer? (dat stukkie raak ik even kwijt)

Op 10 november 2003 21:14:53 schreef Nofri:
Nu snap ik er helemaal niets meer van. Ik snap wel hoe PWM werkt, maar zoals julie hem aansturen niet (niet meer thans :)) PWM = pulse width modulation = duty cycly laten veranderen, correct?
(frequentie blijft gelijk)

Maar hoe veranderen julie de pulse width dan adh van de timer? (dat stukkie raak ik even kwijt)

Het is niet zo heel moeilijk hoor :) Ik ben ook maar een beginneling.

Als je een beetje C kunt is het makkelijk te zien, maar ik zal een toelichting geven. Je hebt een bereik van 0 - 100% in stapjes van 1%. Stel je wilt 60% schakelen, dan doet de code het volgende:

- stel teller in op 0
- is de teller kleiner dan 60?
- zo ja, zet dan de output hoog
- verhoog de teller met 1

- is de teller kleiner dan 60?
- zo nee, zet dan de output laag
- verhoog teller met 1 en tel door tot 100.

zo zorg je ervoor dat je 60% van de tijd een hoog signaal afgeeft.

Ik heb alleen 2 vragen,

- volgens de multimeter schakel ik met 652 Hz, dit zou toch veeeeel hoger moeten zijn als ik die delay van 1ms weghaal?

- mijn ventilatoren piepen enorm, hoe haal ik die piep weg?

Waarschijnlijk heeft je multimeter ongeveer gelijk en schakel je in het hoorbare gebied. 625 Hz geeft al een naar piepje. Op welke kloksnelheid draait die AT?

[Bericht gewijzigd door A vd Linden op ]

Op 10 november 2003 23:53:56 schreef A vd Linden:
Waarschijnlijk heeft je multimeter ongeveer gelijk en schakel je in het hoorbare gebied. 625 Hz geeft al een naar piepje. Op welke kloksnelheid draait die AT?

Met deze code:


#include <mega163.h>

int	iTeller,
	iPWM1 = 60,
 
void main(void)
{

	PORTB=0x00;
	DDRB=0xFF;

		while (1)
  		{
      		for(iTeller = 0; iTeller <= 100; iTeller++)
      		{
      			if(iTeller <= iPWM1)
      				PORTB.1 = 1;
      			else
      				PORTB.1 = 0;      			
      		}

      	};
}

schakelt hij met zo'n 625 Mhz. En inderdaad, daarom hoor ik die pieptoon.

Het rare is alleen dat de controller op 4Mhz werkt, je zou dan toch verwachten dat hij deze code hierboven dan veel vaker zou moeten uitvoeren?

Op 11 november 2003 08:18:00 schreef Toverstaf:
schakelt hij met zo'n 625 Mhz. En inderdaad, daarom hoor ik die pieptoon.

Het rare is alleen dat de controller op 4Mhz werkt

1. Jij hebt goeie oren
2. Moet die 4 MHz geen 4 GHz zijn ;)

Ja, het zou wel moeten... Maak eens een assemblerfile van die C code? O, en hoort die komma na de 60 (zal ie wel negeren, maar je weet het nooit).

Volgens mij moet het wel wat sneller gaan inderdaad. Staat de interne klok niet aan?

Ik weet dat je bij assemblercode je stackpointer moet vastleggen, hoeft dat bij C niet?

Aaahaaa, nu snap ik em! :)

Moet er geen ';' achter de 60? (en in C moet je toch ook nog volgende regel aangeven? (met \ of \\ geloof ik)

igg zoiets :
int itimer, ipwm = 60;

En nog een vraagje. Moet bij je If....Then statement geen accolades? {} (weet het niet zeker hoor, ik begin ook maar net met C)
:)

[Bericht gewijzigd door Nofri op ]

Op 11 november 2003 15:53:37 schreef Nofri:
Aaahaaa, nu snap ik em! :)

Moet er geen ';' achter de 60? (en in C moet je toch ook nog volgende regel aangeven? (met \ of \\ geloof ik)

igg zoiets :
int itimer, ipwm = 60;

En nog een vraagje. Moet bij je If....Then statement geen accolades? {} (weet het niet zeker hoor, ik begin ook maar net met C)
:)

er hoeft geen ';' erachter omdat het een opsomming van integers is, de laatste van de reeks moet dus wel een ';' hebben, de rest kun je scheiden met ','.

Zolang de if-statement niet uit meerdere regels bestaat heb je geen accolades nodig.

Maargoed, ik heb eens navraag gedaan en de if-statement is de boosdoener. Deze vraagt namelijk heel veel processorload. Er is dus weinig wat aan te doen.

Weet iemand of ik dit via hardware kan oplossen? Ik wil alleen die irritante piep kwijt :)

Kun je niets met assembler dan? Dat vind ik een stuk makkelijker dan C, maarja, da's misschien heel persoonlijk.

Op 11 november 2003 16:59:41 schreef Benadski:
Kun je niets met assembler dan? Dat vind ik een stuk makkelijker dan C, maarja, da's misschien heel persoonlijk.

Eigenlijk niet nee :)

Ik doe alles al jaren in C, en op zich zou het niets uit mogen maken. Als ik compileer krijg ik gewoon assembler terug. Dit is de assembler code die de compiler ervan maakt:

http://members.chello.nl/~bjhm.velthuis/pwm_test.asm

met deze c-code:

http://members.chello.nl/~bjhm.velthuis/pwm_test.c

Dubbelpost...

[Bericht gewijzigd door Benadski op ]

Dat kan nooit dat kleine stukje code zijn wat je hierboven geeft of wel?!? Zou wel erg inefficient gaan dan...

O, en maak eens van die int een char!!!

[Bericht gewijzigd door Benadski op ]

Op 11 november 2003 17:10:25 schreef Benadski:
Dat kan nooit dat kleine stukje code zijn wat je hierboven geeft of wel?!? Zou wel erg inefficient gaan dan...

O, en maak eens van die int een char!!!

Toch is dat wel de code :)
Als ik de int verander in een char stijgt hij van 625 Hz naar 1030 Hz, een behoorlijke verbetering maar nog niet genoeg.

Ik denk echt dat het met de software niet gaat werken. Wat zou er gebeuren als ik een condensator over de ventilator zet?

Ik denk dat je dan veel kwijt bent aan koppel en dus luchtstuwkracht. Je zet dan PWM om naar DC met een beetje kortsluiting... :P

Of gebruik je een open collector uitgang aan je fan? Geef je schema eens?

Er moet toch wel meer dan 1khz uit 1 PWM te halen zijn? (software) Straks hoor je nog bij 6PWM's het getik van de motoren omdat ze zo langzaam gaan :S

Wat is de klok dan? Want die atmega163 kan even snel lopen als de atmega32, waarop -EasY-- met een 16Mhz kristal 122Khz 4 kanaals PWM haalt.

Als de if.... zo zwaar is misschien volgende proberen :

Ipv de software timer de hardwaretimer (8bits voor 255 stapjes) gebruiken en dan bij een compare match een interrupt laten afgeven. dus > Je wilt 50% PWM hebben. Dat is ongeveer 128 (255*05). Je stelt de compare match in op 128 en laat de timer lopen. (en een pin hoog maken) Bij 128 geeft de timer een interupt, de interupt verwijst door naar een pin laag maken. etc etc. Bij meerdere PWMs laat je de compare matchh steeds veranderen van klein naar groot. Dus als je 3 pwm's hebt, met de volgende instellingen 60%, 50% en 90% laat je de compare macth eerst doen op 128 (50%), na deze match maakt ie de betreffende pin laag, en zet die meteen de match op de volgende PWM, 153 (60%) enz. Gaat dat lukken?

Alleen, als je ervoor zorgt dat een andere procedure de PWM routine onderbreekt heb je dus geen zuivere PWM meer, klopt dat? :)

Benadski, of iemand anders
zou je mij misschien een voorbeeldje kunnen sturen. Hoe je 32 Pwm kanalen krijgt?? ik hoef er eigenlijk maar 12 aan te sturen maar dan snap ik het principe tenminste.

bouwie_2000@hotmail.com

Op 19 november 2003 12:54:00 schreef Fixation:
Benadski, of iemand anders
zou je mij misschien een voorbeeldje kunnen sturen. Hoe je 32 Pwm kanalen krijgt?? ik hoef er eigenlijk maar 12 aan te sturen maar dan snap ik het principe tenminste.

bouwie_2000@hotmail.com

In professionele motoraansturingen zul je het pwm signaal automatisch laten genereren door de hardware of een nauwkeurige timer-interrupt met hoge prioriteit gebruiken. Het volgende fragmentje geeft een globaal idee van hoe je zoiets zou kunnen implementeren. De uitwerking is een leuke oefening..

Let op dat je sommige global variables volatite definieert om te voorkomen dat de optimalizatie van de compiler roet in het eten gooit!

Globaal idee:
Je hebt een drietal arrays emt daarin de gewenste pwm niveaus voor de 32 kanalen (0-255), een pointer to de uitgangspoort en een pointer naar de pin op die poort.
Een timer loopt elke x usec af en genereert het pwm signaal.


// Global variables, defines, include
 
 
#define TIMER1_VAL   0xC02B   // (100msec@8Mhz+64divider)


volatile unsigned char PwmLevel[32]; 
volatile unsigned char Count1


etc..


// Interrupt function
// Called on every timer overflow


INTERRUPT (SIG_OVERFLOW1)
{
  unsigned char idx;
  // RESET TIMER/COUNTER
  TCNT1 = TIMER1_VAL;	
  // Inc counter
  Count1++'
  // Generate pwm
  for (idx=0;idx<32;idx++) {
    if (PwmLevel[idx]<Count1) {
      sbi(PointerToPort[idx],PointerToPin[idx]);
    } else {
      cbi(PointerToPort[idx],PointerToPin[idx]);
    };
  };
}


// Main function


int main(void) {
  // Initialize timer 1 here
  // Set pwm levels
  // Interacion with other components, etc.
}

Okee ik heb ook rond de 6 pwm kanalen nodig op mijn AVR.. maar nou zit ik te denken omdat ik naast het PWM gedeelte ook veel rekenwerk heb op de ingang (dmx 512 protocol) Zoek ik een manier waardoor ik extern PWM kan maken.. dus met de controller die bepaalde gegevens geeft over pwm signaal en exstern tot echt pwm wordt gemaakt.. Is dit mogelijk en zoja HOE??

BTW weet iemand een goed forum over AVR met bascom avr proggen??

Je neemt een AVR/PIC voor je DMX die om de zoveel tijd een waarde (0-255) per PWM kanaal doorstuurt naar een andere PIC/AVR die dan de PWM doet.

Het is hier stil geworden... Is het project al gelukt??

ikd enk eigenlijk een betje een multiplexing hier,maar hangt af van de toepassing