Chào các anh ! Em đang viết chương trình dò đường cho Píc6f877a Dùng ngôn ngữ C . Nhưng gặp khó khăn quá . Em chưa biết đưa giá trị điều xung ra động cơ như thế nào . Chương trình em tham khảo trên mạng là viết cho động cơ có Encoder . Động cơ của em không dùng encoder.
Một vấn đề nữa là em không thể mô phỏng PWM trên Protesus được bang máy hiển thị sóng
Cảm ơn các anh và các ban!!!!!!!!!!!!!
Đây là chuơng trình em tham khảo trên mạng có sủa đổi nhưng không chạy mong mọi người giúp đỡ !
Một vấn đề nữa là em không thể mô phỏng PWM trên Protesus được bang máy hiển thị sóng
Cảm ơn các anh và các ban!!!!!!!!!!!!!
Đây là chuơng trình em tham khảo trên mạng có sủa đổi nhưng không chạy mong mọi người giúp đỡ !
#include <16f877A.h>
#include <def_877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
//#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io (a)
#use fast_io (B)
#use fast_io (c)
#use fast_io (d)
#use fast_io (e)
/****************************************
* CONSTANTS - HANG SO*/
#define SENSOR PORTD
#define MOTOR_LEFT_DIR RC0
#define MOTOR_LEFT_PWM RC1
#define MOTOR_RIGHT_PWM RC2
#define MOTOR_RIGHT_DIR RC3
//- CAC HAM SU DUNG TRONG CHUONG TRINH
void left_motor_forward();
void right_motor_forward();
void left_motor_reverse();
void right_motor_reverse();
void left_motor_stop();
void right_motor_stop();
void motor_stop();
void speed (signed int left_motor_speed, signed int right_motor_speed);
///////////////////////////////////////////////////////////
//CAC HAM DIEU KHIEN TOC DO DONG CO
void left_motor_forward(int value)
{
MOTOR_LEFT_DIR=1;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void right_motor_forward(int value)
{
MOTOR_RIGHT_DIR=1;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp1(CCP_PWM);
set_pwm1_duty(value);
}
void left_motor_reverse(int value)
{
MOTOR_LEFT_DIR=0;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void right_motor_reverse(int value)
{
MOTOR_RIGHT_DIR=0;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp1(CCP_PWM);
set_pwm1_duty(value);
}
void left_motor_stop()
{
setup_ccp1(CCP_OFF);
}
void right_motor_stop()
{
setup_ccp1(CCP_OFF);
}
void motor_stop()
{
left_motor_stop();
right_motor_stop();
}
//HAM XUAT TOC DO 2 DONG CO: Left motor: -100 - 100 , Right motor: -100 - 100
// 0:Stop,100:FORWARD 100%,-100:Reverse 100%
//CAC HAM HO TRO SPEED
void speed (signed int left_motor_speed, signed int right_motor_speed)
{
int left_pwm_value=0,right_pwm_value=0;
/* Left motor */
if( left_motor_speed >= 0 )
{
left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
left_motor_forward(left_pwm_value);
}
else
{
left_motor_speed = -left_motor_speed;
left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
left_motor_reverse(left_pwm_value);
}
/* Right motor */
if( right_motor_speed >= 0 )
{
right_pwm_value = 1.25*right_motor_speed; // (125*left_motor_speed/100)
right_motor_forward(right_pwm_value);
}
else
{
right_motor_speed = -right_motor_speed;
right_pwm_value = 1.25*right_motor_speed; // (125*left_motor_speed/100)
right_motor_reverse(right_pwm_value);
}
}
///////////////////////////////////////
//MAIN FUNCTION - CHUONG TRINH CHINH
/* CHUONG TRÌNH CHÍNH */
void main ()
{
TRISC=0x00; // PORTC là ngõ ra ( d?ng co)
TRISD=0x00; // PORTD là ngõ vào (c?m bi?n quang)
while(1)
{
switch (SENSOR)
{
case 0b00011000:
speed(100,100);
break;
case 0b00001100:
speed(90,80);
break;
case 0b00000110:
speed(70,80);
break;
case 0b00000011:
speed(60,70);
break;
case 0b00000001:
speed(50,60);
break;
case 0b00110000:
speed(80,90);
break;
case 0b01100000:
speed(70,80);
break;
case 0b11000000:
speed(60,70);
break;
case 0b10000000:
speed(50,60);
break;
}
}
}
#include <def_877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
//#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io (a)
#use fast_io (B)
#use fast_io (c)
#use fast_io (d)
#use fast_io (e)
/****************************************
* CONSTANTS - HANG SO*/
#define SENSOR PORTD
#define MOTOR_LEFT_DIR RC0
#define MOTOR_LEFT_PWM RC1
#define MOTOR_RIGHT_PWM RC2
#define MOTOR_RIGHT_DIR RC3
//- CAC HAM SU DUNG TRONG CHUONG TRINH
void left_motor_forward();
void right_motor_forward();
void left_motor_reverse();
void right_motor_reverse();
void left_motor_stop();
void right_motor_stop();
void motor_stop();
void speed (signed int left_motor_speed, signed int right_motor_speed);
///////////////////////////////////////////////////////////
//CAC HAM DIEU KHIEN TOC DO DONG CO
void left_motor_forward(int value)
{
MOTOR_LEFT_DIR=1;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void right_motor_forward(int value)
{
MOTOR_RIGHT_DIR=1;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp1(CCP_PWM);
set_pwm1_duty(value);
}
void left_motor_reverse(int value)
{
MOTOR_LEFT_DIR=0;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void right_motor_reverse(int value)
{
MOTOR_RIGHT_DIR=0;
setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
setup_ccp1(CCP_PWM);
set_pwm1_duty(value);
}
void left_motor_stop()
{
setup_ccp1(CCP_OFF);
}
void right_motor_stop()
{
setup_ccp1(CCP_OFF);
}
void motor_stop()
{
left_motor_stop();
right_motor_stop();
}
//HAM XUAT TOC DO 2 DONG CO: Left motor: -100 - 100 , Right motor: -100 - 100
// 0:Stop,100:FORWARD 100%,-100:Reverse 100%
//CAC HAM HO TRO SPEED
void speed (signed int left_motor_speed, signed int right_motor_speed)
{
int left_pwm_value=0,right_pwm_value=0;
/* Left motor */
if( left_motor_speed >= 0 )
{
left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
left_motor_forward(left_pwm_value);
}
else
{
left_motor_speed = -left_motor_speed;
left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
left_motor_reverse(left_pwm_value);
}
/* Right motor */
if( right_motor_speed >= 0 )
{
right_pwm_value = 1.25*right_motor_speed; // (125*left_motor_speed/100)
right_motor_forward(right_pwm_value);
}
else
{
right_motor_speed = -right_motor_speed;
right_pwm_value = 1.25*right_motor_speed; // (125*left_motor_speed/100)
right_motor_reverse(right_pwm_value);
}
}
///////////////////////////////////////
//MAIN FUNCTION - CHUONG TRINH CHINH
/* CHUONG TRÌNH CHÍNH */
void main ()
{
TRISC=0x00; // PORTC là ngõ ra ( d?ng co)
TRISD=0x00; // PORTD là ngõ vào (c?m bi?n quang)
while(1)
{
switch (SENSOR)
{
case 0b00011000:
speed(100,100);
break;
case 0b00001100:
speed(90,80);
break;
case 0b00000110:
speed(70,80);
break;
case 0b00000011:
speed(60,70);
break;
case 0b00000001:
speed(50,60);
break;
case 0b00110000:
speed(80,90);
break;
case 0b01100000:
speed(70,80);
break;
case 0b11000000:
speed(60,70);
break;
case 0b10000000:
speed(50,60);
break;
}
}
}
Comment