Создаю систему управления вентильным двигателем на основе PIC. Помогите разобраться, двигатель разгоняется до некой скорости, потом начинает крутиться в другую сторону. Понимаю, что нужно что-то еще, но что, понять не могу. САУ определенно не мой конек.
Спойлер
Код:
/*
Processor: PIC16F1947
Compiler: CCS for PIC
*/
#include <16F1947.h>
#use delay(crystal=20MHz)
#USE TIMER(TIMER=1,TICK=100us,BITS=16,NOISR)
#USE PWM(OUTPUT=PIN_G0, FREQUENCY=1khz, DUTY=50)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
char buf[100];
int8 count;
int32 time, k;
int16 st[5];
long duty_val;
int8 a;
#int_ccp1
void ccp1(){
output_d(st[a]);
a = a + 1;
if (a == 6) a = 0;
}
/*#INT_RB
void interp(){
set_ticks(0);
while(input_state(PIN_B0));
time = get_ticks();
}*/
void razgon(){
int8 hall;
hall = input_e();
if (hall == 0b00000101){
a = 0;
}
else {
if(hall == 0b00000001){
a = 1;
}
else {
if(hall == 0b00000011){
a = 2;
}
else {
if(hall == 0b00000010){
a = 3;
}
else {
if(hall == 0b00000110){
a = 4;
}
else {
if(hall == 0b00000100){
a = 5;
}}}}}} }
void shim(long dutyv){
pwm_on();
pwm_set_duty_percent(dutyv);
}
/*
PIN_D0 - U-
PIN_D1 - U+
PIN_D2 - V-
PIN_D3 - V+
PIN_D4 - W-
PIN_D5 - W+
----------
----------
*/
/*void start(){
while(!(input_state(PIN_E1))){
output_bit(PIN_D5, 1);
shim(k);
if(k<900) k=k+1;
}
}*/
int main (void)
{
st[5] = 0b00001001;
st[0] = 0b00100001;
st[1] = 0b00100100;
st[2] = 0b00000110;
st[3] = 0b00010010;
st[4] = 0b00011000;
time = 0;
int k = 0;
k = 10;
set_tris_e(255);
set_tris_d(0);
output_d(0);
a = 0;
//int32 i = 10000;
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts (INT_CCP1);
enable_interrupts (GLOBAL);
razgon();
shim(k);
while (1){
/* pwm_off();
start();
delay_ms(10000);
*/
}
return 0;
}