<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>https://elektronikforumet.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MrFreeze</id>
	<title>ElektronikWikin - Användarbidrag [sv]</title>
	<link rel="self" type="application/atom+xml" href="https://elektronikforumet.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MrFreeze"/>
	<link rel="alternate" type="text/html" href="https://elektronikforumet.com/wiki/Special:Bidrag/MrFreeze"/>
	<updated>2026-05-07T02:37:09Z</updated>
	<subtitle>Användarbidrag</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://elektronikforumet.com/wiki/index.php?title=PWM-generator&amp;diff=2488</id>
		<title>PWM-generator</title>
		<link rel="alternate" type="text/html" href="https://elektronikforumet.com/wiki/index.php?title=PWM-generator&amp;diff=2488"/>
		<updated>2008-01-04T21:10:56Z</updated>

		<summary type="html">&lt;p&gt;MrFreeze: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exempelkod på en interrupt driven PWM generator till ATMEGAs med timer.&lt;br /&gt;
&lt;br /&gt;
'''Vad är det och vad kan man göra med den ?'''&lt;br /&gt;
&lt;br /&gt;
Det är en fristående interrupt funktion (den använter 16-bitars timern)&lt;br /&gt;
som fristående då genererar pulser för att styra tex. hobby servon.&lt;br /&gt;
Det menar att du kan göra vad du vill i din kod utan att behöva&lt;br /&gt;
göra annat än att säga till vart du vill att servona ska.&lt;br /&gt;
&lt;br /&gt;
'''Till vilken Atmega är koden skriven?'''&lt;br /&gt;
&lt;br /&gt;
Till Atmega32 men borde vara kompatibel med dom flesta&lt;br /&gt;
som har en 16-bits timer.&lt;br /&gt;
&lt;br /&gt;
'''Hur använder man den ?'''&lt;br /&gt;
&lt;br /&gt;
Lägg till de två filerna i projektet (pwmsignals.h och pwmsignals.c)&lt;br /&gt;
inkludera pwmsignals.h ( include &amp;quot;pwmsignals.h&amp;quot; ) i din kod och&lt;br /&gt;
starta upp interrupterna med StartPWMSignals();&lt;br /&gt;
&lt;br /&gt;
Nu har du upp till (max) 16 servopulser (de kan ändras med en #define&lt;br /&gt;
som finns i koden, #define SERVOS 15)på PORTA och PORTB.&lt;br /&gt;
Du kan gärna ändra så att andra portar används, då får du ändra&lt;br /&gt;
funktionen port();&lt;br /&gt;
&lt;br /&gt;
Från början så står alla servon på 1.5msec (mittenläget på servot)&lt;br /&gt;
och för att vrida dom så kan då använda dessa funktioner:&lt;br /&gt;
&lt;br /&gt;
''void segmentsetdirectvalue(int segment,int16_t value);''&lt;br /&gt;
&lt;br /&gt;
för att sätta en position på ett servo, tex såhär för att köra servo 0&lt;br /&gt;
max till höger:&lt;br /&gt;
segmentsetdirectvalue(0,2000);&lt;br /&gt;
eller servo 7 max till vänster;&lt;br /&gt;
segmentsetdirectvalue(0,1000);&lt;br /&gt;
&lt;br /&gt;
Man kan också säga till interrupten att köra från en &amp;quot;vinkel&amp;quot; till en annan,&lt;br /&gt;
då får man först läsa in &amp;quot;tiden&amp;quot; (i mikro sekunder) från interrupten:&lt;br /&gt;
&lt;br /&gt;
''unsigned long int timenow=usecselapsed();''&lt;br /&gt;
&lt;br /&gt;
lägga till lite (hur många micro sekunder man vill att det ska ta)&lt;br /&gt;
till exempet en sekund:&lt;br /&gt;
&lt;br /&gt;
''unsigned long int timeend=timenow+1000000;''&lt;br /&gt;
&lt;br /&gt;
så är det bara att tala om för &amp;quot;interrupten&amp;quot; att vi vill tex.&lt;br /&gt;
gå från längst till vänster till längst till höger för servo 3:&lt;br /&gt;
&lt;br /&gt;
''segmentset(3,timenow,1000,timeend,2000);''&lt;br /&gt;
&lt;br /&gt;
så kommer interrupten automatiskt att vrida servot från vänster till&lt;br /&gt;
höger på en sekund.&lt;br /&gt;
Tja, iallafall så kommer servot att försöka att klara av det.&lt;br /&gt;
&lt;br /&gt;
Ett par andra liknande funktioner:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gå på Tid tid från läget Läget1 till läget Läget2 för servot Servo:&lt;br /&gt;
&lt;br /&gt;
''segmentsetnow(Servo,Tid,Läget1,Läget2);''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
eller gå från nuvarande läge till läget Läge på Tid tid:&lt;br /&gt;
&lt;br /&gt;
''segmentgoto(Servo,Tid,Läge);''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hur koden funkar :&lt;br /&gt;
Signalerna genereras en efter annan, servo 0 puls, servo 1 puls ,&lt;br /&gt;
servo 2 puls osv.&lt;br /&gt;
När sista servot har gjort sin puls kollas det om vi behöver vänta lite,&lt;br /&gt;
alltså har rundan tagit typ minst 20msec (denna siffra kan man ändra,&lt;br /&gt;
det är en #define i koden).&lt;br /&gt;
&lt;br /&gt;
Detta är ju inte en optimal lösning, men det borde funka ok på typ upp till 10-15&lt;br /&gt;
servos antar jag, har genererat pulser för 16 men hade bara två servon för test&lt;br /&gt;
inkopplade men det funkade bra (servona snurrade som dom skulle utan att hacka).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Koden:'''&lt;br /&gt;
&lt;br /&gt;
Jag lyckas inte lägga in koden direkt på sidan så det får bli en länk för tillfället:&lt;br /&gt;
&lt;br /&gt;
[http://ludviglarsson.free.fr/PWM.rar AVR-Studio-Project]&lt;/div&gt;</summary>
		<author><name>MrFreeze</name></author>
	</entry>
	<entry>
		<id>https://elektronikforumet.com/wiki/index.php?title=Atmel_AVR&amp;diff=2487</id>
		<title>Atmel AVR</title>
		<link rel="alternate" type="text/html" href="https://elektronikforumet.com/wiki/index.php?title=Atmel_AVR&amp;diff=2487"/>
		<updated>2008-01-04T21:10:42Z</updated>

		<summary type="html">&lt;p&gt;MrFreeze: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.atmel.com/avr AVR] är en 8-bitars [[Mikrokontrollers|mikrokontroller]] tillverkad av [http://www.atmel.com Atmel].&lt;br /&gt;
&lt;br /&gt;
===Utvecklingsmiljöer===&lt;br /&gt;
*Linux, [[AVR-GCC-Linux]]&lt;br /&gt;
*Windows, [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR Studio]&lt;br /&gt;
&lt;br /&gt;
===Exempel kod===&lt;br /&gt;
*Styr många servon med en Atmega32, [[PWM-generator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.avrfreaks.net/index.php?module=FreaksDevices&amp;amp;func=viewDev Samlingssida] med datablad och jämförelsetabell över Atmel´s AVR-serie.&lt;/div&gt;</summary>
		<author><name>MrFreeze</name></author>
	</entry>
	<entry>
		<id>https://elektronikforumet.com/wiki/index.php?title=PWM-generator&amp;diff=2486</id>
		<title>PWM-generator</title>
		<link rel="alternate" type="text/html" href="https://elektronikforumet.com/wiki/index.php?title=PWM-generator&amp;diff=2486"/>
		<updated>2008-01-04T20:32:58Z</updated>

		<summary type="html">&lt;p&gt;MrFreeze: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exempelkod på en interrupt driven PWM generator till ATMEGAs med timer.&lt;br /&gt;
&lt;br /&gt;
'''Vad är det och vad kan man göra med den ?'''&lt;br /&gt;
&lt;br /&gt;
Det är en fristående interrupt funktion (den använter 16-bitars timern)&lt;br /&gt;
som fristående då genererar pulser för att styra tex. hobby servon.&lt;br /&gt;
Det menar att du kan göra vad du vill i din kod utan att behöva&lt;br /&gt;
göra annat än att säga till vart du vill att servona ska.&lt;br /&gt;
&lt;br /&gt;
'''Till vilken Atmega är koden skriven?'''&lt;br /&gt;
&lt;br /&gt;
Till Atmega8 men borde vara kompatibel med dom flesta&lt;br /&gt;
som har en 16-bits timer.&lt;br /&gt;
&lt;br /&gt;
'''Hur använder man den ?'''&lt;br /&gt;
&lt;br /&gt;
Lägg till de två filerna i projektet (pwmsignals.h och pwmsignals.c)&lt;br /&gt;
inkludera pwmsignals.h ( include &amp;quot;pwmsignals.h&amp;quot; ) i din kod och&lt;br /&gt;
starta upp interrupterna med StartPWMSignals();&lt;br /&gt;
&lt;br /&gt;
Nu har du upp till (max) 16 servopulser (de kan ändras med en #define&lt;br /&gt;
som finns i koden, #define SERVOS 15)på PORTA och PORTB.&lt;br /&gt;
Du kan gärna ändra så att andra portar används, då får du ändra&lt;br /&gt;
funktionen port();&lt;br /&gt;
&lt;br /&gt;
Från början så står alla servon på 1.5msec (mittenläget på servot)&lt;br /&gt;
och för att vrida dom så kan då använda dessa funktioner:&lt;br /&gt;
&lt;br /&gt;
''void segmentsetdirectvalue(int segment,int16_t value);''&lt;br /&gt;
&lt;br /&gt;
för att sätta en position på ett servo, tex såhär för att köra servo 0&lt;br /&gt;
max till höger:&lt;br /&gt;
segmentsetdirectvalue(0,2000);&lt;br /&gt;
eller servo 7 max till vänster;&lt;br /&gt;
segmentsetdirectvalue(0,1000);&lt;br /&gt;
&lt;br /&gt;
Man kan också säga till interrupten att köra från en &amp;quot;vinkel&amp;quot; till en annan,&lt;br /&gt;
då får man först läsa in &amp;quot;tiden&amp;quot; (i mikro sekunder) från interrupten:&lt;br /&gt;
&lt;br /&gt;
''unsigned long int timenow=usecselapsed();''&lt;br /&gt;
&lt;br /&gt;
lägga till lite (hur många micro sekunder man vill att det ska ta)&lt;br /&gt;
till exempet en sekund:&lt;br /&gt;
&lt;br /&gt;
''unsigned long int timeend=timenow+1000000;''&lt;br /&gt;
&lt;br /&gt;
så är det bara att tala om för &amp;quot;interrupten&amp;quot; att vi vill tex.&lt;br /&gt;
gå från längst till vänster till längst till höger för servo 3:&lt;br /&gt;
&lt;br /&gt;
''segmentset(3,timenow,1000,timeend,2000);''&lt;br /&gt;
&lt;br /&gt;
så kommer interrupten automatiskt att vrida servot från vänster till&lt;br /&gt;
höger på en sekund.&lt;br /&gt;
Tja, iallafall så kommer servot att försöka att klara av det.&lt;br /&gt;
&lt;br /&gt;
Ett par andra liknande funktioner:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gå på Tid tid från läget Läget1 till läget Läget2 för servot Servo:&lt;br /&gt;
&lt;br /&gt;
''segmentsetnow(Servo,Tid,Läget1,Läget2);''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
eller gå från nuvarande läge till läget Läge på Tid tid:&lt;br /&gt;
&lt;br /&gt;
''segmentgoto(Servo,Tid,Läge);''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hur koden funkar :&lt;br /&gt;
Signalerna genereras en efter annan, servo 0 puls, servo 1 puls ,&lt;br /&gt;
servo 2 puls osv.&lt;br /&gt;
När sista servot har gjort sin puls kollas det om vi behöver vänta lite,&lt;br /&gt;
alltså har rundan tagit typ minst 20msec (denna siffra kan man ändra,&lt;br /&gt;
det är en #define i koden).&lt;br /&gt;
&lt;br /&gt;
Detta är ju inte en optimal lösning, men det borde funka ok på typ upp till 10-15&lt;br /&gt;
servos antar jag, har genererat pulser för 16 men hade bara två servon för test&lt;br /&gt;
inkopplade men det funkade bra (servona snurrade som dom skulle utan att hacka).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Koden:'''&lt;br /&gt;
&lt;br /&gt;
Jag lyckas inte lägga in koden direkt på sidan så det får bli en länk för tillfället:&lt;br /&gt;
&lt;br /&gt;
[http://ludviglarsson.free.fr/PWM.rar AVR-Studio-Project]&lt;/div&gt;</summary>
		<author><name>MrFreeze</name></author>
	</entry>
	<entry>
		<id>https://elektronikforumet.com/wiki/index.php?title=Atmel_AVR&amp;diff=2485</id>
		<title>Atmel AVR</title>
		<link rel="alternate" type="text/html" href="https://elektronikforumet.com/wiki/index.php?title=Atmel_AVR&amp;diff=2485"/>
		<updated>2008-01-04T20:27:36Z</updated>

		<summary type="html">&lt;p&gt;MrFreeze: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.atmel.com/avr AVR] är en 8-bitars [[Mikrokontrollers|mikrokontroller]] tillverkad av [http://www.atmel.com Atmel].&lt;br /&gt;
&lt;br /&gt;
===Utvecklingsmiljöer===&lt;br /&gt;
*Linux, [[AVR-GCC-Linux]]&lt;br /&gt;
*Windows, [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR Studio]&lt;br /&gt;
&lt;br /&gt;
===Exempel kod===&lt;br /&gt;
*Styr många servon med en Atmega8, [[PWM-generator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.avrfreaks.net/index.php?module=FreaksDevices&amp;amp;func=viewDev Samlingssida] med datablad och jämförelsetabell över Atmel´s AVR-serie.&lt;/div&gt;</summary>
		<author><name>MrFreeze</name></author>
	</entry>
</feed>