Управление двигателем постоянного тока с использованием техники ШИМ, компилятор pic18 и mikroC - PullRequest
0 голосов
/ 19 мая 2019

Мне нужно управлять двигателем постоянного тока с помощью микроконтроллера, PIC18F25k22. У меня есть часть кода в компиляторе MIKROC, но я не знаю, как заставить все это работать вместе, и мне нужно его улучшить. Я дам картину симуляции протея для этого проекта. Скорость двигателя контролируется потенциометром. Поворот потенциометра до уровня 0 должен остановить двигатель, и когда кнопка «DIRECTIE» нажата, я хочу, чтобы двигатель вращался по часовой стрелке, но когда он отпущен, двигатель должен вращаться против часовой стрелки. Двигатель должен начать вращаться, когда кнопка «START-STOP» отпущена, а когда кнопка нажата, двигатель должен остановиться.

Заранее спасибо!

https://imgur.com/a/ktTkvxI ------- симуляция в протей

unsigned int adc_rd;
 long current_duty;

void main() {
 ANSELC = 0;  // Configure PORTC as digital I/O;CU ANSEL SETAM PT FIECARE PIN/port DACA PORTUL E ANALOGIC SAU DIGITAL, DACA E 0 E DIGITAL;DACA E 1 E ANALOPGIC
 ANSELB = 0;  // Configure PORTB as digital I/O;CU ANSEL SETAM PT FIECARE PIN/port DACA PORTUL E ANALOGIC SAU DIGITAL, DACA E 0 E DIGITAL;DACA E 1 E ANALOPGIC

  TRISA0_bit = 1;    //Configure AN0 (RA0) as input; CU TRIS CONFIGURAM DIRECTIA PINILOR, DACA SUNT INTRARI SAU IESIRI, DACA E 1 E INTRARE...
  TRISC = 0;         //PORTC pins are outputs      CU TRIS CONFIGURAM DIRECTIA PINILOR, DACA SUNT INTRARI SAU IESIRI, DACA E 0 E IESIRE...
  TRISB = 0;         //PORTB pins are outputs      CU TRIS CONFIGURAM DIRECTIA PINILOR, DACA SUNT INTRARI SAU IESIRI, DACA E 0 E IESIRE...
  TRISC3_bit = 1;  //Configuram bitul RC3 ca intrare digitala(butonul1)
  TRISC4_bit = 1;   //Configuram bitul RC4 ca intrare digitala(butonul2)


  PWM1_Init(1000);      // Initialize PWM1 module at 1KHz
  PWM1_Start();        // start PWM1
  ADC_Init();         // Initialize ADC

  LATB =  0x02;      //Turn the motor Clockwise

  while (1) {         // endless loop

  adc_rd = ADC_Read(0);     //Read Analog value from Analog channel 0

  //convert voltage level to duty cycle 0-->255
  current_duty = (long) adc_rd * 255;
  current_duty =  current_duty/1023;

  PWM1_Set_Duty(current_duty);  //change duty cycle

  Delay_ms(5);                  // slow down change pace a little
  }
}
...