<?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=5841&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-02-06T09:07:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=5841&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-02-05T21:05:52+01:00</updated>
<published>2014-02-05T21:05:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5841&amp;p=68620#p68620</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5841&amp;p=68620#p68620"/>
<title type="html"><![CDATA[Re: AT90PWM3B - Power Stage Controller]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5841&amp;p=68620#p68620"><![CDATA[
Edytuj post i wstaw kod w znacznikach SYNTAX = C, bo program jest teraz wybrakowany w wielu miejscach. Dodatkowo kod powinien być sformatowany tzn,. z wcięciami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 5 lut 2014, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lauthar]]></name></author>
<updated>2014-02-06T09:07:11+01:00</updated>
<published>2014-02-05T20:28:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5841&amp;p=68608#p68608</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5841&amp;p=68608#p68608"/>
<title type="html"><![CDATA[AT90PWM3B - Power Stage Controller]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5841&amp;p=68608#p68608"><![CDATA[
Witam, czy ktoś może bawił się układem AT90PWM3B i uruchamiał PSC ? Konkretnie chodzi o aplikacje do sterowania silnikami BLDC z wykorzystaniem czujników halla. Mam problem z uruchomieniem PSC. Zamieszczam poniżej kod programu, jeżeli ktoś robił podobną aplikację i miał problemy to bardzo proszę o rade. Kod wzorowałem na aplikacji atmelowskiej dostępnej <a href="http://www.atmel.com/tools/MATUREATAVRMC100.aspx?tab=documents"  class="postlink">tutaj</a>.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br /><br />enum {BIPOLAR, UNIPOLAR0, UNIPOLAR1};<br />enum {CW, CCW};<br />enum {HALL_001 = 1, HALL_010 = 2, HALL_011 = 3, HALL_100 = 4, HALL_101 = 5, HALL_110 = 6};<br />enum {STOP = false, RUN = true};<br /><br />#defineMSB(uint16_t)(((uint8_t*)&amp;uint16_t)&#91;1&#93;)<br />#defineLSB(uint16_t)(((uint8_t*)&amp;uint16_t)&#91;0&#93;)<br />#defineHIGH(void)MSB(void)<br />#defineLOW(void)LSB(void)<br />//Max predkosc silnika<br />// MAXSPEED = (60 * 255) / (N * t_timer0 * max_speed&#91;RPM&#93;)<br />// N - liczba biegunow<br />// t_timer0 = 16us<br />#define MAXSPEED 30000<br />//ilosc probek do pomiaru predkosci/ default = 8<br />#define SAMPLES 8<br />//stala do regulacji<br />#define KMUL 4<br />// definicja do czujnikow halla<br />#define HALL() \<br />  ((PIND&amp;(1&lt;&lt;PIND7)) &gt;&gt; PIND7) \<br />| ((PINC&amp;(1&lt;&lt;PINC6)) &gt;&gt; 5)\<br />| ((PIND&amp;(1&lt;&lt;PIND5)) &gt;&gt; 3)<br />//definicje do ledow<br />#defineLED_RUN(1&lt;&lt;PORTC7)<br />#defineLED_STOP(1&lt;&lt;PORTB5)<br />#defineLED_STANDBY(1&lt;&lt;PORTB4)<br />#defineLED_ERROR(1&lt;&lt;PORTB3)<br />//zmienne<br />//jezeli zmienna globlana jest w innych plikach dodaj przedrostek extern<br />uint8_t strategia, overflow_t0 = 0, j = 1, i = 0;<br />uint8_t mcu_zmierzona_predkosc = 0, mc_cmd_speed =0;<br />uint16_t srednia =0;<br />bool ticktick, kierunek_obrotow, rzeczywista_predkosc = true, predkosc_do_odczytu = false, tryb_mcu_run_stop = STOP, hamowanie = false;<br />uint16_t predkosc_zmierzona = 0;<br />uint8_t nastawa_predkosci;<br />uint8_t cykl_pracy = 0;<br />//zmienne do regulatora PID<br />int16_t blad_predkosci = 0, ostatni_blad_predkosci = 0, s_integral = 0, integral = 0, proportional = 0;<br />int16_t s_derivative = 0, derivative = 0;<br />uint8_t KP = 1, KI = 1, KD = 1;<br />uint16_t g_reg =0;<br />//funkcje<br />void HARDWARE_init();<br />void PSC_init();<br />void OVERCURRENT();<br />void PSC_OCRxx_default(uint16_t OCRnRA, uint16_t OCRnRB, uint16_t OCRnSA, uint16_t OCRnSB);<br />void PSC_TO_UPDATE();<br />void PSC_UPDATE();<br />void mcu_cykl_pracy(uint8_t poziom);<br />void timer0_init();<br />void timer1_init();<br />void okreslenie_predkosci();<br />void motor_restart();<br />void motor_start();<br />void ACOMP_init();<br />void zmiana_komutacji(uint8_t pozycja);<br />uint8_t kontrola_predkosci(uint8_t komenda_predkosci);<br />void zmierz_predkosc_silnika(uint8_t zmierzona_predkosc);<br />uint8_t pobierz_zmierzona_predkosc();<br />uint8_t pobierz_polozenie_czujnikow();<br />void petla_regulacji();<br />uint8_t pobierz_cykl_pracy();<br />void ustaw_predkosc_silnika(uint8_t speed);<br />uint8_t pobierz_predkosc_silnika();<br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />////////////////////////////////PROGRAM GLOWNY//////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />int main()<br />{<br />HARDWARE_init();<br />// strategia sterowania silnikiem =&gt; BIPOLAR - sterowanie bipolarne<br />// UNIPOLAR0 - sterowanie unipolarne dodatnie, UNIPOLAR1 - sterowanie unipolarne ujemne<br />strategia = BIPOLAR;<br />kierunek_obrotow = CW;<br />tryb_mcu_run_stop = STOP;<br />ustaw_predkosc_silnika(0);//0 -255<br />zmierz_predkosc_silnika(0);<br />for (i = 0; i &lt; 6; i++)<br />{<br />PORTB ^=LED_STANDBY;<br />_delay_ms(1000);<br />}<br />void motor_start();<br />while(1)<br />{<br />if(ticktick == true)<br />{<br />ticktick = false;<br />g_reg += 1;<br />if(g_reg &gt;= 320)<br />{<br />g_reg =0;<br />ustaw_predkosc_silnika(100);<br />petla_regulacji();<br />}//end if<br />}//end if<br />//if (PIND &amp;(1&lt;&lt;PIND1)) PORTB |= LED_ERROR;<br />//else PORTB &amp;= ~LED_ERROR;<br />if (PCTL2 &amp; (1&lt;&lt;PRUN2))<br />{<br />PORTC |= LED_RUN;<br />PORTB &amp;= ~LED_STOP;<br />}//end if<br />else<br />{<br />PORTC &amp;= ~LED_RUN;<br />PORTB |= LED_STOP;<br />}//end else if<br />} //end while(1)<br /><br /><br />} //end main<br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />///////////////////////////////FUNKCJEIPODPROGRAMY//////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />void HARDWARE_init()<br />{<br />DDRB |= (1&lt;&lt;DDB5) | (1&lt;&lt;DDB4) | (1&lt;&lt;DDB3) | (1&lt;&lt;DDB1) | (1&lt;&lt;DDB0) | (1&lt;&lt;DDB6) | (1&lt;&lt;DDB7);<br />DDRC |=(1&lt;&lt;DDC7) | (1&lt;&lt;DDC0);<br />DDRD |=(1&lt;&lt;DDD0);<br />PORTB &amp;= ~((1&lt;&lt;PORTB5) | (1&lt;&lt;PORTB4) | (1&lt;&lt;PORTB3) | (1&lt;&lt;PORTB0) | (1&lt;&lt;PORTB1) | (1&lt;&lt;PORTB6) | (1&lt;&lt;PORTB7));<br />PORTC &amp;=~((1&lt;&lt;PORTC7) | (1&lt;&lt;PORTC0));<br />PORTD &amp;=~(1&lt;&lt;PORTD0);<br />PSC_init();<br />timer0_init();<br />timer1_init();<br />ACOMP_init();<br />//OVERCURRENT();<br />sei(); //zezwolenie na przerwanie<br />} //end HARDWARE_init<br /><br />//funkcja inicjujaca<br />void PSC_init()<br />{<br />//PLL_init<br />PLLCSR |= (0&lt;&lt;PLLF) | (1&lt;&lt;PLLE);<br />//zaczekaj az uruchomi sie PLL<br />while(!(PLLCSR &amp; (1&lt;&lt;0)))<br />//PSC_clock<br /><br />PCNF0 |=(1&lt;&lt;PCLKSEL0); // 0 - CLK - I/O // 1 - CLK PLL<br />PCTL0 |=(0&lt;&lt;PPRE01) | (0&lt;&lt;PPRE00); //PRESCALER - CLK/1<br />PCNF1 |=(1&lt;&lt;PCLKSEL1); // 0 - CLK - I/O // 1 - CLK PLL<br />PCTL1 |=(0&lt;&lt;PPRE11) | (0&lt;&lt;PPRE10); //PRESCALER - CLK/1<br />PCNF2 |=(1&lt;&lt;PCLKSEL2); // 0 - CLK - I/O // 1 - CLK PLL<br />PCTL2 |=(0&lt;&lt;PPRE21) | (0&lt;&lt;PPRE20); //PRESCALER - CLK/1<br /><br />//zainicjowanie podstawowych parametrow rejestrow OCRxx<br />PSC_OCRxx_default(0,0,0,0);<br /><br />//PSC_config<br />// POPn // 0 - wyjscia aktywne w stanie niskim/ 1 - wyjscia aktywne w stanie wysokim<br />//(PCNFn)PMODEn1 PMODEn0(0,0) - ONE RAMP (0,1) - TWO RAMP (1,0) - FOUR RAMP (1,1) - CENTERED<br />// (PCTLn) PAOcnA PAOcnB / 1 - sygnal z PSCINn zadziala bezposrednio na wyjscia PSC<br />PCNF0 |=(1&lt;&lt;POP0);<br />PCNF0 |=(1&lt;&lt;PMODE01) | (0&lt;&lt;PMODE00);<br />PCTL0 |=(1&lt;&lt;PAOC0A) | (1&lt;&lt;PAOC0B);<br />PCTL0 |= (1&lt;&lt;PARUN0); //autorun on set PRUN2<br /><br />PCNF1 |=(1&lt;&lt;POP1);<br />PCNF1 |=(1&lt;&lt;PMODE11) | (0&lt;&lt;PMODE10);<br />PCTL1 |=(1&lt;&lt;PAOC1A) | (1&lt;&lt;PAOC1B);<br />PCTL1 |= (1&lt;&lt;PARUN1); //autorun on set PRUN2 &amp; PARUN0<br /><br />PCNF2 |=(1&lt;&lt;POP2);<br />PCNF1 |=(1&lt;&lt;PMODE21) | (0&lt;&lt;PMODE20);<br />PCTL2 |=(1&lt;&lt;PAOC2A) | (1&lt;&lt;PAOC2B);<br />PCTL2 |= (1&lt;&lt;PRUN2); //PSC START<br /><br />}//PSC_init<br /><br />void OVERCURRENT()<br />{<br />DDRD &amp;=~(1&lt;&lt;DDD1);<br />PFRC0A |=(1&lt;&lt;PFLTE0A) | (1&lt;&lt;PRFM0A2) | (1&lt;&lt;PRFM0A1) | (1&lt;&lt;PRFM0A0);<br />}//end OVERCURRENT<br />///////////////////////////////////////////////////////////////////////////////////////////////////////<br />///////////////////////////////////////////////////////////////////////////////////////////////////////<br />// RA - on time0RB - on time1SA - dead time0SB - dead time1<br />void PSC_OCRxx_default(uint16_t OCRnRA, uint16_t OCRnRB, uint16_t OCRnSA, uint16_t OCRnSB)<br />{<br />// OCRnSALOCRnSAHOCRnRALOCRnRAHOCRnSBLOCRnSBHOCRnRBLOCRnRBH<br />//PSC0<br />OCR0SAL =LOW(OCRnSA);//dead time0<br />OCR0SAH =HIGH(OCRnSA);//dead time0<br />OCR0RAL =LOW(OCRnRA);//on time0<br />OCR0RAH =HIGH(OCRnRA);//on time0<br />OCR0SBL =LOW(OCRnSB);//dead time1<br />OCR0SBH =HIGH(OCRnSB);//dead time1<br />OCR0RBL =LOW(OCRnRB);//on time1<br />OCR0RBH =HIGH(OCRnRB);//on time1<br />//PSC1<br />OCR1SAL =LOW(OCRnSA);//dead time0<br />OCR1SAH =HIGH(OCRnSA);//dead time0<br />OCR1RAL =LOW(OCRnRA);//on time0<br />OCR1RAH =HIGH(OCRnRA);//on time0<br />OCR1SBL =LOW(OCRnSB);//dead time1<br />OCR1SBH =HIGH(OCRnSB);//dead time1<br />OCR1RBL =LOW(OCRnRB);//on time1<br />OCR1RBH =HIGH(OCRnRB);//on time1<br />//PSC2<br />OCR1SAL =LOW(OCRnSA);//dead time0<br />OCR1SAH =HIGH(OCRnSA);//dead time0<br />OCR1RAL =LOW(OCRnRA);//on time0<br />OCR1RAH =HIGH(OCRnRA);//on time0<br />OCR1SBL =LOW(OCRnSB);//dead time1<br />OCR1SBH =HIGH(OCRnSB);//dead time1<br />OCR1RBL =LOW(OCRnRB);//on time1<br />OCR1RBH =HIGH(OCRnRB);//on time1<br />}<br /><br />void PSC_TO_UPDATE()<br />{<br />//(PCNFn)PLOCKn / 1 - wlacza tryb aktualizacji rejestrow OCR / 1 --&gt; 0 aktualizacja rejestrow po zmianie na stan niski<br />PCNF0 |=(1&lt;&lt;PLOCK0);<br />PCNF1 |=(1&lt;&lt;PLOCK1);<br />PCNF2 |=(1&lt;&lt;PLOCK2);<br />PCNF0 |=(1&lt;&lt;POP0);<br />PCNF0 |=(1&lt;&lt;PMODE01) | (0&lt;&lt;PMODE00);<br />PCNF1 |=(1&lt;&lt;POP1);<br />PCNF1 |=(1&lt;&lt;PMODE11) | (0&lt;&lt;PMODE10);<br />PCNF2 |=(1&lt;&lt;POP2);<br />PCNF1 |=(1&lt;&lt;PMODE21) | (0&lt;&lt;PMODE20);<br />PCNF0 |=(1&lt;&lt;PCLKSEL0); // 0 - CLK - I/O // 1 - CLK PLL<br />PCNF1 |=(1&lt;&lt;PCLKSEL1); // 0 - CLK - I/O // 1 - CLK PLL<br />PCNF2 |=(1&lt;&lt;PCLKSEL2); // 0 - CLK - I/O // 1 - CLK PLL<br />}<br />void PSC_UPDATE()<br />{<br />//(PCNFn)PLOCKn / 1 - wlacza tryb aktualizacji rejestrow OCR / 1 --&gt; 0 aktualizacja rejestrow po zmianie na stan niski<br />PCNF0 &amp;=~(1&lt;&lt;PLOCK0);<br />PCNF1 &amp;=~(1&lt;&lt;PLOCK1);<br />PCNF2 &amp;=~(1&lt;&lt;PLOCK2);<br />}<br /><br />void mcu_cykl_pracy (uint8_t poziom)<br />{<br />uint8_t poziom_cyklu;<br />poziom_cyklu = poziom;<br /><br />PSC_TO_UPDATE();<br /><br /><br /><br />if(strategia == BIPOLAR)<br />{<br />//PSCOUT00 / PSCOUT10 / PSCOUT20 - MOSFET HIGH<br />OCR0RAL = poziom_cyklu;<br />OCR0RAH = 0;<br />OCR1RAL = poziom_cyklu;<br />OCR1RAH = 0;<br />OCR2RAL = poziom_cyklu;<br />OCR2RAH = 0;<br />//PSCOUT01 / PSCOUT11 / PSCOUT21 - MOSFET LOW<br />OCR0RBL = poziom_cyklu;<br />OCR0RBH = 0;<br />OCR1RBL = poziom_cyklu;<br />OCR1RBH = 0;<br />OCR2RBL = poziom_cyklu;<br />OCR2RBH = 0;<br />}//endif<br />else if(strategia == UNIPOLAR0)<br />{<br />//PSCOUT00 / PSCOUT10 / PSCOUT20 - MOSFET HIGH<br />OCR0RAL = poziom_cyklu;<br />OCR0RAH = 0;<br />OCR1RAL = poziom_cyklu;<br />OCR1RAH = 0;<br />OCR2RAL = poziom_cyklu;<br />OCR2RAH = 0;<br />//PSCOUT01 / PSCOUT11 / PSCOUT21 - MOSFET LOW<br />OCR0RBL = 0;<br />OCR0RBH = 0;<br />OCR1RBL = 0;<br />OCR1RBH = 0;<br />OCR2RBL = 0;<br />OCR2RBH = 0;<br />}<br />else if(strategia == UNIPOLAR1)<br />{<br />//PSCOUT00 / PSCOUT10 / PSCOUT20 - MOSFET HIGH<br />OCR0RAL = 0;<br />OCR0RAH = 0;<br />OCR1RAL = 0;<br />OCR1RAH = 0;<br />OCR2RAL = 0;<br />OCR2RAH = 0;<br />//PSCOUT01 / PSCOUT11 / PSCOUT21 - MOSFET LOW<br />OCR0RBL = poziom_cyklu;<br />OCR0RBH = 0;<br />OCR1RBL = poziom_cyklu;<br />OCR1RBH = 0;<br />OCR2RBL = poziom_cyklu;<br />OCR2RBH = 0;<br />}<br />cli(); //nie zezwalaj na przerwania<br />PSC_UPDATE();<br />sei(); // zezwolenie na przerwanie<br />}//end cykl_pracy<br /><br />void timer0_init()<br />{<br />//timer0 tryb NORMAL / PRESCALER =  256/ 16us<br />TCCR0B |=(1&lt;&lt;CS02);<br />TIMSK0 |=(1&lt;&lt;TOIE0);<br />}//end timer0_init<br />void timer1_init()<br />{<br />//timer 1 tryb CTC / PRESCALER = 64 / 256us<br />TCCR1A |=(1&lt;&lt;WGM12) | (1&lt;&lt;CS11) | (1&lt;&lt;CS10);<br />OCR1AL = 63;<br />TIMSK1 |=(1&lt;&lt;OCIE1A);<br />}//end timer1_init<br /><br />void okreslenie_predkosci()<br />{<br />uint16_t wartosc_t0;<br />uint32_t nowy_odczyt_predkosci;<br />if(predkosc_do_odczytu==true)<br />{<br />wartosc_t0 = (overflow_t0&lt;&lt;8) + TCNT0;<br />if(wartosc_t0 ==0)wartosc_t0 += 1;<br />nowy_odczyt_predkosci = MAXSPEED / wartosc_t0;<br />if(nowy_odczyt_predkosci &gt; 255) nowy_odczyt_predkosci = 255;<br /><br />if(rzeczywista_predkosc == false)<br />{<br />//srednia predkosc<br />srednia += nowy_odczyt_predkosci;<br />if (j &gt;= SAMPLES)<br />{<br />j = 1;<br />zmierz_predkosc_silnika(srednia &gt;&gt;3);<br />srednia = 0;<br />}//end if<br />else j++;<br />}//end if<br />else<br />{<br />//rzeczywista predkosc<br />zmierz_predkosc_silnika(nowy_odczyt_predkosci);<br />}//end else if<br />TCNT0 = 0x00;<br />overflow_t0 = 0;<br />predkosc_do_odczytu = false;<br />}//end if<br />}// end okreslenie_predkosci<br /><br />void motor_restart()<br />{<br />tryb_mcu_run_stop = RUN;<br />petla_regulacji();<br />mcu_cykl_pracy(pobierz_cykl_pracy());<br />zmiana_komutacji(pobierz_polozenie_czujnikow());<br /><br />} //end motor_restart<br /><br />void motor_start()<br />{<br />if (!(PCTL2 &amp; (1&lt;&lt;PRUN2)))PSC_OCRxx_default(0,0,0,0);<br />tryb_mcu_run_stop = RUN;<br />petla_regulacji();<br />mcu_cykl_pracy(pobierz_cykl_pracy());<br />zmiana_komutacji(pobierz_polozenie_czujnikow());<br /><br />}//end motor_start<br /><br />void ACOMP_init()<br />{<br />//vref internal 2,56V<br />ADMUX |=(1&lt;&lt;REFS1) | (1&lt;&lt;REFS0);<br />//inicjacja komparatora analogowego<br />// wlaczenie / odblokowanie przerwania komparatora po zmianie stanu  jego wyjscia<br />// podlaczenia ujemnego wejscia do vref = 2,13V<br />//komparator 0<br />AC0CON |=(1&lt;&lt;AC0EN) | (1&lt;&lt;AC0IE) | (1&lt;&lt;AC0M1);<br />//komparator 1<br />AC1CON |=(1&lt;&lt;AC1EN) | (1&lt;&lt;AC1IE) | (1&lt;&lt;AC1M1);<br />//komparator 2<br />AC2CON |=(1&lt;&lt;AC2EN) | (1&lt;&lt;AC2IE) | (1&lt;&lt;AC2M1);<br />}<br /><br />void zmiana_komutacji(uint8_t pozycja)<br />{<br />if((tryb_mcu_run_stop == RUN) &amp;&amp; (nastawa_predkosci != 0))<br />{<br />mcu_cykl_pracy(pobierz_cykl_pracy());<br /><br />switch(pozycja)<br />{<br />case HALL_001:<br />if(kierunek_obrotow == CCW)<br />{<br />//HIGH_COIL_W &amp; LOW_COIL_U<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(1&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (1&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />else<br />{<br />//HIGH_COIL_U &amp; LOW_COIL_W<br />    PSOC0 |= (1&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(1&lt;&lt;POEN2B);<br />}<br />break;<br />case HALL_101:<br />if(kierunek_obrotow == CCW)<br />{<br />//HIGH_COIL_V &amp; LOW_COIL_U<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(1&lt;&lt;POEN0B);<br />    PSOC1 |= (1&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />else<br />{<br />//HIGH_COIL_U &amp; LOW_COIL_V<br />    PSOC0 |= (1&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(1&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />break;<br />case HALL_100:<br />if(kierunek_obrotow == CCW)<br />{<br />//HIGH_COIL_V &amp; LOW_COIL_W<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (1&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(1&lt;&lt;POEN2B);<br />}<br />else<br />{<br />//HIGH_COIL_W &amp; LOW_COIL_V<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(1&lt;&lt;POEN1B);<br />    PSOC2 |= (1&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />break;<br />case HALL_110:<br />if(kierunek_obrotow == CCW)<br />{<br />//HIGH_COIL_U &amp; LOW_COIL_W<br />    PSOC0 |= (1&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(1&lt;&lt;POEN2B);<br />}<br />else<br />{<br />//HIGH_COIL_W &amp; LOW_COIL_U<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(1&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (1&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />break;<br />case HALL_010:<br />if(kierunek_obrotow == CCW)<br />{<br />//HIGH_COIL_U &amp; LOW_COIL_V<br />    PSOC0 |= (1&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(1&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />else<br />{<br />//HIGH_COIL_V &amp; LOW_COIL_U<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(1&lt;&lt;POEN0B);<br />    PSOC1 |= (1&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />break;<br />case HALL_011:<br />if(kierunek_obrotow == CCW)<br />{<br />//HIGH_COIL_W &amp; LOW_COIL_V<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (0&lt;&lt;POEN1A)|(1&lt;&lt;POEN1B);<br />    PSOC2 |= (1&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br />}<br />else<br />{<br />//HIGH_COIL_V &amp; LOW_COIL_W<br />    PSOC0 |= (0&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />    PSOC1 |= (1&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />    PSOC2 |= (0&lt;&lt;POEN2A)|(1&lt;&lt;POEN2B);<br />}<br />break;<br />default: break;<br />}//end switch<br /><br />}//end if<br />else if(hamowanie == true)<br />{<br />PSOC0 |= (0&lt;&lt;POEN0A)|(1&lt;&lt;POEN0B);<br />PSOC1 |= (0&lt;&lt;POEN1A)|(1&lt;&lt;POEN1B);<br />PSOC2 |= (0&lt;&lt;POEN2A)|(1&lt;&lt;POEN2B);<br />}//end else if<br />else<br />{<br />PSOC0 |= (0&lt;&lt;POEN0A)|(0&lt;&lt;POEN0B);<br />PSOC1 |= (0&lt;&lt;POEN1A)|(0&lt;&lt;POEN1B);<br />PSOC2 |= (0&lt;&lt;POEN2A)|(0&lt;&lt;POEN2B);<br /><br /><br />}//end else if<br />}//end zmiana_komutacji<br /><br />uint8_t kontrola_predkosci(uint8_t komenda_predkosci)<br />{<br />uint8_t praca = 0;<br />int32_t increment = 0;<br /><br />blad_predkosci = komenda_predkosci - pobierz_zmierzona_predkosc();<br />//regulator - czlon P<br />proportional = KP * blad_predkosci;<br />//regulator - czlon I<br />s_integral = s_integral + blad_predkosci;<br />if(s_integral &gt;255)s_integral = 255;<br />if(s_integral &lt; -255)s_integral = -255;<br />integral = KI * s_integral;<br />//regulator - czlon D<br />s_derivative = blad_predkosci - ostatni_blad_predkosci;<br />if(s_derivative &gt;255)s_derivative = 255;<br />if(s_derivative &lt; -255)s_derivative = -255;<br /><br />derivative = KD * s_derivative;<br />ostatni_blad_predkosci = blad_predkosci;<br /><br />//kalkulacja cyklu pracy<br />increment = proportional + integral + derivative;<br />increment = increment &gt;&gt; KMUL;<br /><br />//nasycenie zmiennej<br />if(increment &gt;= (int16_t)(255)) praca = 255;<br />else<br />{<br />if(increment &lt;= (int16_t)(0)) praca = 0;<br />else praca = (uint8_t)(increment);<br />}//end else if<br />return praca;<br />}//end kontrola_predkosci<br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />uint8_t pobierz_polozenie_czujnikow()<br />{<br />return HALL();<br />}//end pobierz_polozenie_czujnikow<br /><br />void petla_regulacji()<br />{<br />cykl_pracy = kontrola_predkosci(pobierz_predkosc_silnika());<br />}//end petla_regulacji<br /><br />void zmierz_predkosc_silnika(uint8_t zmierzona_predkosc)<br />{<br />mcu_zmierzona_predkosc = zmierzona_predkosc;<br />}//end zmierz_predkosc_silnika<br /><br />uint8_t pobierz_zmierzona_predkosc()<br />{<br />return mcu_zmierzona_predkosc;<br />}//end pobierz_zmierzona_predkosc<br /><br />uint8_t pobierz_cykl_pracy()<br />{<br />return cykl_pracy;<br />}//end pobierz_cykl_pracy<br /><br />void ustaw_predkosc_silnika(uint8_t speed)<br />{<br />mc_cmd_speed = speed;<br />}<br />uint8_t pobierz_predkosc_silnika()<br />{<br />return mc_cmd_speed;<br />}<br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />///////////////////// Podprogramy przerwań//////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br />ISR(TIMER0_OVF_vect)<br />{<br />TCNT0 = 0x00;<br />++overflow_t0;<br />//sprawdzenie czy po 125 ms nastapila komutacja<br />if(overflow_t0 &gt;= 100)<br />{<br />overflow_t0 = 0;<br />if(tryb_mcu_run_stop == STOP) motor_restart();<br />}//end if<br />}//end ISR timer0<br />ISR(TIMER1_COMPA_vect)<br />{<br />ticktick = true;<br />}//end ISR timer1<br /><br />ISR(ANALOG_COMP_0_vect)<br />{<br />zmiana_komutacji(HALL());<br />if(PIND&amp;(1&lt;&lt;PORTD7))<br />{<br />okreslenie_predkosci();<br />predkosc_do_odczytu = false; // odczekaj obrot<br />}//end if<br />else predkosc_do_odczytu = true;<br />}// end ISR ACOMP0<br /><br />ISR(ANALOG_COMP_1_vect)<br />{<br />zmiana_komutacji(HALL());<br />}// end ISR ACOMP1<br /><br />ISR(ANALOG_COMP_2_vect)<br />{<br />zmiana_komutacji(HALL());<br />}// end ISR ACOMP2[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=705">Lauthar</a> — 5 lut 2014, o 20:28</p><hr />
]]></content>
</entry>
</feed>