<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=8&amp;t=19329&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-10-08T20:49:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=19329&amp;mode</id>
<entry>
<author><name><![CDATA[PawelPWR]]></name></author>
<updated>2017-10-08T20:49:05+01:00</updated>
<published>2017-10-08T20:49:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196654#p196654</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196654#p196654"/>
<title type="html"><![CDATA[Re: Sterownik silnika BLDC - przejście na BackEMF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196654#p196654"><![CDATA[
zmieniłem trochę kod programu jednak silnik jak by co jakiś czas na moment utykał - prawdopodobnie fazy są za szybko zmieniane. Doczytałem że moment ZC nie jest jednoznaczny ze zmiana komutacji - należy odczekać jeszcze 30 stopni elektrycznych (jeden obieg falownika to 360 stopni). <br /><br />zmiana jest w main() i w podprogramie obsługi przerwania ISR (ANALOG_COMP_vect).<br />Ponadto zauważyłem ze zmiana sterowania na BackEMF powoduje ze dolne MOSFETY strasznie sie grzeją  <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;MK_USART/mkuart.h&quot;<br /><br />// makra dla diod<br />#define led_pin0 (1&lt;&lt;PB0)// dioda 1<br />#define led_on0 PORTB |= led_pin0<br />#define led_off0 PORTB &amp;= ~led_pin0<br />#define led_tog0 PORTB ^= led_pin0<br /><br />#define led_pin1 (1&lt;&lt;PB1)// dioda 2<br />#define led_on1 PORTB |= led_pin1<br />#define led_off1 PORTB &amp;= ~led_pin1<br />#define led_tog1 PORTB ^= led_pin1<br /><br />// maktra dla tranzystorów dolnych - one beda w pelni wysterowywane<br />#define T2 (1&lt;&lt;PB7)<br />#define T2_on PORTB |= T2<br />#define T2_off PORTB &amp;= ~T2<br /><br />#define T4 (1&lt;&lt;PB6)<br />#define T4_on PORTB |= T4<br />#define T4_off PORTB &amp;= ~T4<br /><br />#define T6 (1&lt;&lt;PB2)<br />#define T6_on PORTB |= T6<br />#define T6_off PORTB &amp;= ~T6<br /><br />// makra do przerwania<br />#define komperator_ON ACSR |= (1&lt;&lt;ACIE)<br />#define licznik_OFF TIMSK1 &amp;= ~(1&lt;&lt;OCIE1A);<br /><br />// ZMIENNE<br />uint8_t iloscObiegow=0, stan=0;<br /><br />volatile uint32_t licznik=50, licznikPredkosci=0, komperator;<br /><br />uint8_t  wyp;<br />uint32_t czas_us=1000000, pomiar;<br /><br />char uart_buf&#91;100&#93;;<br />char rozpedzony=0;<br /><br /><br /><br />// NAGLOWKI FUNKCJI<br />void inicjalizacja_timerow();<br />void moj_delay ();<br />void procedura_startu();<br />void rozpedzanie();<br />void analizuj_dane_rs232( char * buf );<br />void inicjalizacja_komperatora_ADC0 ();<br />void inicjalizacja_komperatora_ADC1 ();<br />void inicjalizacja_komperatora_ADC2 ();<br />void komutacja();<br />void komutacjaBEMF();<br />void komutacjaBEMFzCzasem();<br />void silnik_stop();<br />void pomiarPredkosci();<br /><br /><br />int main(void)<br />{<br />// ustawienia rejestrów kierunkowych - DDRx<br />DDRB |= led_pin1|led_pin0;// dioda debug ustawionie portu jako wyjscie<br />DDRB |= T2|T4|T6|(1&lt;&lt;PB3);// porty do których podpiete sa tranzystory - ustawione sa jako wyjscie<br />DDRD |= (1&lt;&lt;PD5)|(1&lt;&lt;PD3);// piny OC0A/B oraz OC2B ustawione jako wyjscie<br /><br />inicjalizacja_timerow();<br /><br />//komperator_ON;<br /><br />silnik_stop();<br /><br />//inicjalizacja uart<br />register_uart_str_rx_event_callback ( analizuj_dane_rs232 );<br />USART_Init( __UBRR );<br /><br />sei();// globalne odblokowanie przerwan<br /><br />moj_delay(czas_us);<br /><br /><br />while (1)<br />    {<br />led_on0;<br />UART_RX_STR_EVENT ( uart_buf ); // oczekuje na pojawienie sie transmisji z komputera<br />komutacja();<br />komperator=0;<br />while (rozpedzony==1) //do tej petli wejddzie po 160 obiegach<br />{<br />led_off0;<br />komutacja();<br /><br />UART_RX_STR_EVENT ( uart_buf );<br /><br />if(iloscObiegow==195)<br />{<br />led_on1;<br />komperator=1;<br />licznik_OFF;<br />komperator_ON;<br />UART_RX_STR_EVENT ( uart_buf );<br />while (rozpedzony==1)<br />{<br />UART_RX_STR_EVENT ( uart_buf );<br />}<br />}<br /><br />}<br /><br />    }<br />}<br /><br /><br />ISR (TIMER1_COMPA_vect)// Podprogram obsługi przerwania od Timera 1<br />{<br />if (licznik&lt;10) licznik++;<br />licznikPredkosci++;<br />}<br /><br /><br />ISR (ANALOG_COMP_vect)<br />{<br />if ((komperator==1)&amp;&amp;(stan==6))// Pierszy takt falownika<br />{<br />OCR2B=0;<br />OCR2A=wyp;<br />T4_on;<br /><br />stan=1;<br />inicjalizacja_komperatora_ADC0();<br />}<br /><br />if ((komperator==2)&amp;&amp;(stan==1))<br />{<br />OCR2A=wyp;<br />T4_off;<br />T6_on;<br /><br />stan=2;<br />inicjalizacja_komperatora_ADC1();<br />}<br /><br />if ((komperator==3)&amp;&amp;(stan==2))<br />{<br />OCR2A=0;<br />OCR0B=wyp;<br /><br />stan=3;<br /><br />inicjalizacja_komperatora_ADC2();<br />}<br /><br />if ((komperator==4)&amp;&amp;(stan==3))<br />{<br />OCR0B=wyp;<br />T6_off;<br />T2_on;<br /><br />stan=4;<br /><br />inicjalizacja_komperatora_ADC0();<br />}<br /><br />if ((komperator==5)&amp;&amp;(stan==4))<br />{<br />OCR0B=0;<br />OCR2B=wyp;<br /><br />stan=5;<br /><br />inicjalizacja_komperatora_ADC1();<br />}<br /><br />if ((komperator==6)&amp;&amp;(stan==5))<br />{<br />//pomiarPredkosci();<br /><br /><br />OCR2B=wyp;<br />T2_off;<br />T4_on;<br /><br />stan=6;<br />komperator=0;<br /><br />inicjalizacja_komperatora_ADC2();<br />}<br /><br />komperator++;<br />}<br /><br />void inicjalizacja_timerow()<br />{<br />// ustawienia timera 0<br />TCCR0A |= (1&lt;&lt;WGM00);// ustawienie trybu timera - Fast PWM Mode str. 147<br />TCCR0A |= (1&lt;&lt;COM0B1)|(0&lt;&lt;COM0B0);// str. 146<br /><br />TCCR0B |= (1&lt;&lt;CS01);// ustawienie prescalera str. 149<br /><br />//ustawienia timera 2<br />TCCR2A |= (1&lt;&lt;WGM20);//Str. 212<br />TCCR2A |= (1&lt;&lt;COM2B1)|(0&lt;&lt;COM2B0);<br />TCCR2A |= (1&lt;&lt;COM2A1)|(0&lt;&lt;COM2A0);<br />TCCR2B |= (1&lt;&lt;CS21);//Str. 214<br /><br />// ustawienia timera 1<br />TCCR1B |= (1&lt;&lt;WGM12);// ustawienie trybu timera - CTC (mode 4) Str. 179<br />TCCR1B |= (1&lt;&lt;CS11)|(1&lt;&lt;CS10);// ustawienia prescalera - ustawiony na 8 str. 180<br /><br />TIMSK1 |= (1&lt;&lt;OCIE1A);// zezwolenie na przerwanie Compare Match<br /><br />}<br /><br />void moj_delay (uint32_t czas_us)<br />{<br />OCR1A = (125*czas_us-1)/1000;<br />}<br /><br />void procedura_startu()<br />{<br />// ustaienie walu silnika w zadanej pozycji<br />silnik_stop(); // na wszelki wypadek<br /><br />iloscObiegow = 0;<br /><br />// uruchamiany jest pierszy takt falownika na 150ms ustawianie w pozycji poczatkowej<br />OCR2A = 120; // wypelnienie na 30 procent<br />T4_on;<br /><br />_delay_ms(400); //koniec ustawiania walu w zadanej pozycji<br /><br />// czas startu odlicznia czasu<br />wyp = 120;<br /><br />czas_us = 19000;<br />moj_delay(czas_us);<br /><br />licznik=1;<br />stan=6;<br /><br />while(1)<br />{<br />rozpedzanie();<br />komutacja();<br /><br />UART_RX_STR_EVENT ( uart_buf );<br /><br />if (iloscObiegow == 160)<br />{<br />rozpedzony=1;<br />break;// wejscie do petli głownej<br />}<br /><br />}<br /><br />}<br /><br />void rozpedzanie()<br />{<br />if (iloscObiegow==5)<br />{<br />wyp=140;<br />czas_us = 18000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==10)<br />{<br />czas_us = 17000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==15)<br />{<br />czas_us = 16000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==20)<br />{<br />wyp=120;<br />czas_us = 15000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==22)<br />{<br />wyp=120;<br />czas_us = 13500;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==26)<br />{<br />wyp=120;<br />czas_us = 11000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==30)<br />{<br />wyp=120;<br />czas_us = 10000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==34)<br />{<br />wyp=120;<br />czas_us = 9000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==38)<br />{<br />wyp=120;<br />czas_us = 8000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==50)<br />{<br />wyp=120;<br />czas_us = 7500;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==60)<br />{<br />wyp=120;<br />czas_us = 7000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==70)<br />{<br />wyp=120;<br />czas_us = 6500;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==80)<br />{<br />wyp=120;<br />czas_us = 6000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==90)<br />{<br />wyp=120;<br />czas_us = 5500;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==110)<br />{<br />wyp=120;<br />czas_us = 5000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==120)<br />{<br />wyp=120;<br />czas_us = 4500;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==130)<br />{<br />wyp=120;<br />czas_us = 4000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==150)<br />{<br />wyp=100;<br />//czas_us = 3000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==152)<br />{<br />wyp=80;<br />//czas_us = 3000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==154)<br />{<br />wyp=70;<br />//czas_us = 3000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==156)<br />{<br />wyp=60;<br />//czas_us = 3000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==158)<br />{<br />wyp=50;<br />//czas_us = 3000;<br />moj_delay(czas_us);<br />}<br />}<br /><br />void analizuj_dane_rs232( char * buf )<br />{<br /><br />char *wsk;<br /><br />wsk = strtok( buf, &quot;,&quot; );<br /><br />if ( !strcmp(wsk, &quot;czas&quot;) )<br />{<br />wsk = strtok( NULL, &quot;,&quot; );<br /><br />long data = atol( wsk );<br />moj_delay(data);<br /><br />}<br /><br />if ( !strcmp(wsk, &quot;pwm&quot;) )<br />{<br />wsk = strtok( NULL, &quot;,&quot; );<br /><br />uint8_t data = atoi( wsk );<br />wyp = data;<br />}<br /><br />if (!strcmp(wsk, &quot;start&quot;))<br />{<br />procedura_startu();<br />}<br /><br />if (!strcmp(wsk, &quot;stop&quot;))<br />{<br />silnik_stop();<br />licznik=50;<br />}<br /><br /><br />}<br /><br />void inicjalizacja_komperatora_ADC0 ()<br />{<br />ADCSRB |= (1&lt;&lt;ACME);<br />ADMUX = 0b00000000;//adc0<br />}<br /><br />void inicjalizacja_komperatora_ADC1 ()<br />{<br />ADCSRB |= (1&lt;&lt;ACME);<br />ADMUX = 0b00000000;<br />ADMUX |= (1&lt;&lt;MUX0);//adc1<br />}<br /><br />void inicjalizacja_komperatora_ADC2 ()<br />{<br />ADCSRB |= (1&lt;&lt;ACME);<br />ADMUX = 0b00000000;<br />ADMUX |= (1&lt;&lt;MUX1);//adc2<br />}<br /><br /><br /><br />void silnik_stop()<br />{<br />OCR2B = 0;<br />OCR2A = 0;<br />OCR0B = 0;<br />T2_off;<br />T4_off;<br />T6_off;<br /><br />rozpedzony=0;<br />licznik=50;<br />}<br /><br />void komutacja(){<br />if ((licznik==1)&amp;&amp;(stan==6))// Pierszy takt falownika<br />{<br /><br />OCR2B=0;<br />OCR2A=wyp;<br />T4_on;<br /><br />stan=1;<br />inicjalizacja_komperatora_ADC0();<br />}<br />if ((licznik==2)&amp;&amp;(stan==1))<br />{<br />OCR2A=wyp;<br />T4_off;<br />T6_on;<br /><br />stan=2;<br />inicjalizacja_komperatora_ADC1();<br />}<br />if ((licznik==3)&amp;&amp;(stan==2))<br />{<br />OCR2A=0;<br />OCR0B=wyp;<br /><br />stan=3;<br />inicjalizacja_komperatora_ADC2();<br />}<br />if ((licznik==4)&amp;&amp;(stan==3))<br />{<br />OCR0B=wyp;<br />T6_off;<br />T2_on;<br /><br />stan=4;<br />inicjalizacja_komperatora_ADC0();<br />}<br />if ((licznik==5)&amp;&amp;(stan==4))<br />{<br />OCR0B=0;<br />OCR2B=wyp;<br /><br />stan=5;<br />inicjalizacja_komperatora_ADC1();<br />}<br />if ((licznik==6)&amp;&amp;(stan==5))<br />{<br />OCR2B=wyp;<br />T2_off;<br />T4_on;<br /><br />stan=6;<br />licznik=0;<br />inicjalizacja_komperatora_ADC2();<br />if (iloscObiegow&lt;200) iloscObiegow++;<br />}<br />}<br /><br /><br />void komutacjaBEMF(){<br /><br />if ((komperator==1)&amp;&amp;(stan==6))// Pierszy takt falownika<br />{<br />OCR2B=0;<br />OCR2A=wyp;<br />T4_on;<br /><br />stan=1;<br />inicjalizacja_komperatora_ADC0();<br />}<br /><br />if ((komperator==2)&amp;&amp;(stan==1))<br />{<br />OCR2A=wyp;<br />T4_off;<br />T6_on;<br /><br />stan=2;<br />inicjalizacja_komperatora_ADC1();<br />}<br /><br />if ((komperator==3)&amp;&amp;(stan==2))<br />{<br />OCR2A=0;<br />OCR0B=wyp;<br /><br />stan=3;<br /><br />inicjalizacja_komperatora_ADC2();<br />}<br /><br />if ((komperator==4)&amp;&amp;(stan==3))<br />{<br />OCR0B=wyp;<br />T6_off;<br />T2_on;<br /><br />stan=4;<br /><br />inicjalizacja_komperatora_ADC0();<br />}<br /><br />if ((komperator==5)&amp;&amp;(stan==4))<br />{<br />OCR0B=0;<br />OCR2B=wyp;<br /><br />stan=5;<br /><br />inicjalizacja_komperatora_ADC1();<br />}<br /><br />if ((komperator==6)&amp;&amp;(stan==5))<br />{<br />//pomiarPredkosci();<br /><br /><br />OCR2B=wyp;<br />T2_off;<br />T4_on;<br /><br />stan=6;<br />komperator=0;<br /><br />inicjalizacja_komperatora_ADC2();<br />}<br />}<br /><br />void komutacjaBEMFzCzasem(){<br /><br />if ((komperator==1)&amp;&amp;(stan==6))// Pierszy takt falownika<br />{<br />while (1)// w tym whilu czekamy az licznik doliczy do wartości w zmiennej pomiar<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznikPredkosci=0;<br />licznik = 0;<br /><br />OCR2B=0;<br />OCR2A=wyp;<br />T4_on;<br /><br />stan=1;<br />_delay_us(5);<br />inicjalizacja_komperatora_ADC0();<br />break;<br />}<br />}<br />}<br />if ((komperator==2)&amp;&amp;(stan==1))<br />{<br />while (1)<br />{<br />if(pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR2A=wyp;<br />T4_off;<br />T6_on;<br /><br />stan=2;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC1();<br />break;<br />}<br />}<br />}<br />if ((komperator==3)&amp;&amp;(stan==2))<br />{<br />while (1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR2A=0;<br />OCR0B=wyp;<br /><br />stan=3;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC2();<br />break;<br />}<br />}<br />}<br />if ((komperator==4)&amp;&amp;(stan==3))<br />{<br />while (1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR0B=wyp;<br />T6_off;<br />T2_on;<br /><br />stan=4;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC0();<br />break;<br />}<br />}<br /><br /><br />}<br />if ((komperator==5)&amp;&amp;(stan==4))<br />{<br />while (1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR0B=0;<br />OCR2B=wyp;<br /><br />stan=5;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC1();<br />break;<br />}<br />}<br /><br /><br />}<br />if ((komperator==6)&amp;&amp;(stan==5))<br />{<br />while(1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />pomiarPredkosci(); // tutaj zostaje zrobiony pomiar czasu 360stopni<br />licznik=0;<br /><br />OCR2B=wyp;<br />T2_off;<br />T4_on;<br /><br />stan=6;<br />komperator=0;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC2();<br />break;<br />}<br />}<br />}<br /><br />}<br /><br />void pomiarPredkosci()<br />{<br />pomiar=(licznikPredkosci/12); // jest to czas w jakim wał pokonuje 30 stopni elektrycznych<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16750">PawelPWR</a> — 8 paź 2017, o 20:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Arek1111111111]]></name></author>
<updated>2017-10-07T23:21:16+01:00</updated>
<published>2017-10-07T23:21:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196614#p196614</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196614#p196614"/>
<title type="html"><![CDATA[Re: Sterownik silnika BLDC - przejście na BackEMF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196614#p196614"><![CDATA[
Też niedawno próbowałem uruchomić sterownik korzystając z tego samego poradnika. Tak samo juk u Ciebie mogłem ręcznie sterować silnikiem poprzez zmianę czasu między kolejnymi komutacjami. układu back emf nie udało mi się uruchomić, udało mi się natomiast sterować tym silnikiem za pomocą czujników Halla wykorzystując te z napędu DVD.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3349">Arek1111111111</a> — 7 paź 2017, o 23:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PawelPWR]]></name></author>
<updated>2017-10-07T20:04:07+01:00</updated>
<published>2017-10-07T20:04:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196609#p196609</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196609#p196609"/>
<title type="html"><![CDATA[Sterownik silnika BLDC - przejście na BackEMF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19329&amp;p=196609#p196609"><![CDATA[
Witam ostatnio wykonuje sterownik silnika BLDC. Niestety potrafię nim sterować tylko w sposób otwarty tzn. zmieniać ręcznie PWM i czas trwania kluczy danej komutacji. Teraz chciałbym aby silnik był sterowany za pomocą komparatora analogowego (komparator zmieniał by wysterowane tranzystory) ja natomiast podawał bym mu tylko wypełnienie. Niestety nie potrafię przejść na sterowanie BackEMF - silnik się zatrzymuje. Projekt swój opierałem na artykule ze strony <a href="http://mikrokontrolery.blogspot.com/2011/03/silnik-bldc-sterownik-back-emf.html"  class="postlink">http://mikrokontrolery.blogspot.com/2011/03/silnik-bldc-sterownik-back-emf.html</a> utknąłem własnie na danej stronie <br /><br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;MK_USART/mkuart.h&quot;<br /><br />// makra dla diod<br />#define led_pin0 (1&lt;&lt;PB0)// dioda 1<br />#define led_on0 PORTB |= led_pin0<br />#define led_off0 PORTB &amp;= ~led_pin0<br />#define led_tog0 PORTB ^= led_pin0<br /><br />#define led_pin1 (1&lt;&lt;PB1)// dioda 2<br />#define led_on1 PORTB |= led_pin1<br />#define led_off1 PORTB &amp;= ~led_pin1<br />#define led_tog1 PORTB ^= led_pin1<br /><br />// maktra dla tranzystorów dolnych - one beda w pelni wysterowywane<br />#define T2 (1&lt;&lt;PB7)<br />#define T2_on PORTB |= T2<br />#define T2_off PORTB &amp;= ~T2<br /><br />#define T4 (1&lt;&lt;PB6)<br />#define T4_on PORTB |= T4<br />#define T4_off PORTB &amp;= ~T4<br /><br />#define T6 (1&lt;&lt;PB2)<br />#define T6_on PORTB |= T6<br />#define T6_off PORTB &amp;= ~T6<br /><br />// makra do przerwania<br />#define komperator_ON ACSR |= (1&lt;&lt;ACIE)<br />#define licznik_OFF TIMSK1 &amp;= ~(1&lt;&lt;OCIE1A);<br /><br />// ZMIENNE<br />uint8_t iloscObiegow=0, stan=0;<br /><br />volatile uint32_t licznik=50, licznikPredkosci=0, komperator;<br /><br />uint8_t  wyp;<br />uint32_t czas_us=1000000, pomiar;<br /><br />char uart_buf&#91;100&#93;;<br />char rozpedzony=0;<br /><br /><br /><br />// NAGLOWKI FUNKCJI<br />void inicjalizacja_timerow();<br />void moj_delay ();<br />void procedura_startu();<br />void rozpedzanie();<br />void analizuj_dane_rs232( char * buf );<br />void inicjalizacja_komperatora_ADC0 ();<br />void inicjalizacja_komperatora_ADC1 ();<br />void inicjalizacja_komperatora_ADC2 ();<br />void komutacja();<br />void komutacjaBEMF();<br />void komutacjaBEMFzCzasem();<br />void silnik_stop();<br />void pomiarPredkosci();<br /><br /><br />int main(void)<br />{<br />// ustawienia rejestrów kierunkowych - DDRx<br />DDRB |= led_pin1|led_pin0;// dioda debug ustawionie portu jako wyjscie<br />DDRB |= T2|T4|T6|(1&lt;&lt;PB3);// porty do których podpiete sa tranzystory - ustawione sa jako wyjscie<br />DDRD |= (1&lt;&lt;PD5)|(1&lt;&lt;PD3);// piny OC0A/B oraz OC2B ustawione jako wyjscie<br /><br />inicjalizacja_timerow();<br /><br />komperator_ON;<br /><br />silnik_stop();<br /><br />//inicjalizacja uart<br />register_uart_str_rx_event_callback ( analizuj_dane_rs232 );<br />USART_Init( __UBRR );<br /><br />sei();// globalne odblokowanie przerwan<br /><br />moj_delay(czas_us);<br /><br /><br />while (1)<br />    {<br />led_on0;<br />UART_RX_STR_EVENT ( uart_buf ); // oczekuje na pojawienie sie transmisji z komputera<br />komutacja();<br />komperator=0;<br />while (rozpedzony==1) //do tej petli wejddzie po 120 obiegach<br />{<br />led_off0;<br />komutacja();<br /><br />UART_RX_STR_EVENT ( uart_buf );<br /><br />//if(iloscObiegow==199)<br />//{<br /><br />//komperator=1;<br />//licznik_OFF;<br />//komutacjaBEMF();<br />//while (rozpedzony==1)<br />//{<br />//komutacjaBEMF();<br />//UART_RX_STR_EVENT ( uart_buf );<br />//}<br />//}<br /><br />}<br /><br />    }<br />}<br /><br /><br />ISR (TIMER1_COMPA_vect)// Podprogram obsługi przerwania od Timera 1<br />{<br />if (licznik&lt;10) licznik++;<br />licznikPredkosci++;<br />}<br /><br /><br />ISR (ANALOG_COMP_vect)<br />{<br />komperator++;<br />}<br /><br />void inicjalizacja_timerow()<br />{<br />// ustawienia timera 0<br />TCCR0A |= (1&lt;&lt;WGM00);// ustawienie trybu timera - Fast PWM Mode str. 147<br />TCCR0A |= (1&lt;&lt;COM0B1)|(0&lt;&lt;COM0B0);// str. 146<br /><br />TCCR0B |= (1&lt;&lt;CS01);// ustawienie prescalera str. 149<br /><br />//ustawienia timera 2<br />TCCR2A |= (1&lt;&lt;WGM20);//Str. 212<br />TCCR2A |= (1&lt;&lt;COM2B1)|(0&lt;&lt;COM2B0);<br />TCCR2A |= (1&lt;&lt;COM2A1)|(0&lt;&lt;COM2A0);<br />TCCR2B |= (1&lt;&lt;CS21);//Str. 214<br /><br />// ustawienia timera 1<br />TCCR1B |= (1&lt;&lt;WGM12);// ustawienie trybu timera - CTC (mode 4) Str. 179<br />TCCR1B |= (1&lt;&lt;CS11)|(1&lt;&lt;CS10);// ustawienia prescalera - ustawiony na 8 str. 180<br /><br />TIMSK1 |= (1&lt;&lt;OCIE1A);// zezwolenie na przerwanie Compare Match<br /><br />}<br /><br />void moj_delay (uint32_t czas_us)<br />{<br />OCR1A = (125*czas_us-1)/1000;<br />}<br /><br />void procedura_startu()<br />{<br />// ustaienie walu silnika w zadanej pozycji<br />silnik_stop(); // na wszelki wypadek<br /><br />iloscObiegow = 0;<br /><br />// uruchamiany jest pierszy takt falownika na 150ms ustawianie w pozycji poczatkowej<br />OCR2A = 76; // wypelnienie na 30 procent<br />T4_on;<br /><br />_delay_ms(150); //koniec ustawiania walu w zadanej pozycji<br /><br />// czas startu odlicznia czasu<br />wyp = 60;<br /><br />czas_us = 15000;<br />moj_delay(czas_us);<br /><br />licznik=1;<br />stan=6;<br /><br />while(1)<br />{<br />rozpedzanie();<br />komutacja();<br /><br />UART_RX_STR_EVENT ( uart_buf );<br /><br />if (iloscObiegow == 120)<br />{<br />rozpedzony=1;<br />break;// wejscie do petli głownej<br />}<br /><br />}<br /><br />}<br /><br />void rozpedzanie()<br />{<br />if (iloscObiegow==20)<br />{<br />wyp=70;<br />czas_us = 10000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==30)<br />{<br />czas_us = 5000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==40)<br />{<br />czas_us = 3000;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==60)<br />{<br />wyp=60;<br />czas_us = 2450;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==80)<br />{<br />wyp=50;<br />czas_us = 1900;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==100)<br />{<br />wyp=40;<br />czas_us = 1600;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==110)<br />{<br />wyp=40;<br />czas_us = 1350;<br />moj_delay(czas_us);<br />}<br />if (iloscObiegow==120)<br />{<br />wyp=40;<br />czas_us = 1300;<br />moj_delay(czas_us);<br />}<br />}<br /><br />void analizuj_dane_rs232( char * buf )<br />{<br /><br />char *wsk;<br /><br />wsk = strtok( buf, &quot;,&quot; );<br /><br />if ( !strcmp(wsk, &quot;czas&quot;) )<br />{<br />wsk = strtok( NULL, &quot;,&quot; );<br /><br />long data = atol( wsk );<br />moj_delay(data);<br /><br />}<br /><br />if ( !strcmp(wsk, &quot;pwm&quot;) )<br />{<br />wsk = strtok( NULL, &quot;,&quot; );<br /><br />uint8_t data = atoi( wsk );<br />wyp = data;<br />}<br /><br />if (!strcmp(wsk, &quot;start&quot;))<br />{<br />procedura_startu();<br />}<br /><br />if (!strcmp(wsk, &quot;stop&quot;))<br />{<br />silnik_stop();<br />licznik=50;<br />}<br /><br /><br />}<br /><br />void inicjalizacja_komperatora_ADC0 ()<br />{<br />ADCSRB |= (1&lt;&lt;ACME);<br />ADMUX = 0b00000000;//adc0<br />}<br /><br />void inicjalizacja_komperatora_ADC1 ()<br />{<br />ADCSRB |= (1&lt;&lt;ACME);<br />ADMUX = 0b00000000;<br />ADMUX |= (1&lt;&lt;MUX0);//adc1<br />}<br /><br />void inicjalizacja_komperatora_ADC2 ()<br />{<br />ADCSRB |= (1&lt;&lt;ACME);<br />ADMUX = 0b00000000;<br />ADMUX |= (1&lt;&lt;MUX1);//adc2<br />}<br /><br /><br /><br />void silnik_stop()<br />{<br />OCR2B = 0;<br />OCR2A = 0;<br />OCR0B = 0;<br />T2_off;<br />T4_off;<br />T6_off;<br /><br />rozpedzony=0;<br />licznik=50;<br />}<br /><br />void komutacja(){<br />if ((licznik==1)&amp;&amp;(stan==6))// Pierszy takt falownika<br />{<br /><br />OCR2B=0;<br />OCR2A=wyp;<br />T4_on;<br /><br />stan=1;<br />inicjalizacja_komperatora_ADC0();<br />}<br />if ((licznik==2)&amp;&amp;(stan==1))<br />{<br />OCR2A=wyp;<br />T4_off;<br />T6_on;<br /><br />stan=2;<br />inicjalizacja_komperatora_ADC1();<br />}<br />if ((licznik==3)&amp;&amp;(stan==2))<br />{<br />OCR2A=0;<br />OCR0B=wyp;<br /><br />stan=3;<br />inicjalizacja_komperatora_ADC2();<br />}<br />if ((licznik==4)&amp;&amp;(stan==3))<br />{<br />OCR0B=wyp;<br />T6_off;<br />T2_on;<br /><br />stan=4;<br />inicjalizacja_komperatora_ADC0();<br />}<br />if ((licznik==5)&amp;&amp;(stan==4))<br />{<br />OCR0B=0;<br />OCR2B=wyp;<br /><br />stan=5;<br />inicjalizacja_komperatora_ADC1();<br />}<br />if ((licznik==6)&amp;&amp;(stan==5))<br />{<br />OCR2B=wyp;<br />T2_off;<br />T4_on;<br /><br />stan=6;<br />licznik=0;<br />inicjalizacja_komperatora_ADC2();<br />if (iloscObiegow&lt;200) iloscObiegow++;<br />}<br />}<br /><br /><br />void komutacjaBEMF(){<br /><br />if ((komperator==1)&amp;&amp;(stan==6))// Pierszy takt falownika<br />{<br />OCR2B=0;<br />OCR2A=wyp;<br />T4_on;<br /><br />stan=1;<br />inicjalizacja_komperatora_ADC0();<br />}<br /><br />if ((komperator==2)&amp;&amp;(stan==1))<br />{<br />OCR2A=wyp;<br />T4_off;<br />T6_on;<br /><br />stan=2;<br />inicjalizacja_komperatora_ADC1();<br />}<br /><br />if ((komperator==3)&amp;&amp;(stan==2))<br />{<br />OCR2A=0;<br />OCR0B=wyp;<br /><br />stan=3;<br /><br />inicjalizacja_komperatora_ADC2();<br />}<br /><br />if ((komperator==4)&amp;&amp;(stan==3))<br />{<br />OCR0B=wyp;<br />T6_off;<br />T2_on;<br /><br />stan=4;<br /><br />inicjalizacja_komperatora_ADC0();<br />}<br /><br />if ((komperator==5)&amp;&amp;(stan==4))<br />{<br />OCR0B=0;<br />OCR2B=wyp;<br /><br />stan=5;<br /><br />inicjalizacja_komperatora_ADC1();<br />}<br /><br />if ((komperator==6)&amp;&amp;(stan==5))<br />{<br />//pomiarPredkosci();<br /><br /><br />OCR2B=wyp;<br />T2_off;<br />T4_on;<br /><br />stan=6;<br />komperator=0;<br /><br />inicjalizacja_komperatora_ADC2();<br />}<br />}<br /><br />void komutacjaBEMFzCzasem(){<br /><br />if ((komperator==1)&amp;&amp;(stan==6))// Pierszy takt falownika<br />{<br />while (1)// w tym whilu czekamy az licznik doliczy do wartości w zmiennej pomiar<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznikPredkosci=0;<br />licznik = 0;<br /><br />OCR2B=0;<br />OCR2A=wyp;<br />T4_on;<br /><br />stan=1;<br />_delay_us(5);<br />inicjalizacja_komperatora_ADC0();<br />break;<br />}<br />}<br />}<br />if ((komperator==2)&amp;&amp;(stan==1))<br />{<br />while (1)<br />{<br />if(pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR2A=wyp;<br />T4_off;<br />T6_on;<br /><br />stan=2;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC1();<br />break;<br />}<br />}<br />}<br />if ((komperator==3)&amp;&amp;(stan==2))<br />{<br />while (1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR2A=0;<br />OCR0B=wyp;<br /><br />stan=3;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC2();<br />break;<br />}<br />}<br />}<br />if ((komperator==4)&amp;&amp;(stan==3))<br />{<br />while (1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR0B=wyp;<br />T6_off;<br />T2_on;<br /><br />stan=4;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC0();<br />break;<br />}<br />}<br /><br /><br />}<br />if ((komperator==5)&amp;&amp;(stan==4))<br />{<br />while (1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />licznik=0;<br /><br />OCR0B=0;<br />OCR2B=wyp;<br /><br />stan=5;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC1();<br />break;<br />}<br />}<br /><br /><br />}<br />if ((komperator==6)&amp;&amp;(stan==5))<br />{<br />while(1)<br />{<br />if (pomiar&lt;licznik)<br />{<br />pomiarPredkosci(); // tutaj zostaje zrobiony pomiar czasu 360stopni<br />licznik=0;<br /><br />OCR2B=wyp;<br />T2_off;<br />T4_on;<br /><br />stan=6;<br />komperator=0;<br />_delay_us(4);<br />inicjalizacja_komperatora_ADC2();<br />break;<br />}<br />}<br />}<br /><br />}<br /><br />void pomiarPredkosci()<br />{<br />pomiar=(licznikPredkosci/12); // jest to czas w jakim wał pokonuje 30 stopni elektrycznych<br />}[/syntax]<br /><br /><a href="https://obrazkiforum.atnel.pl/16750/e919835d9586cbf2a6f1d9c4b94ee460.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16750/e919835d9586cbf2a6f1d9c4b94ee460.png" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16750/322bcf0c076412429a98368a6a2cc17c.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16750/322bcf0c076412429a98368a6a2cc17c.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16750">PawelPWR</a> — 7 paź 2017, o 20:04</p><hr />
]]></content>
</entry>
</feed>