anh chào các anh!
em là dân cơ khí, em đang làm đề tài điều khiển động cơ DC theo encoder cụ thể như sau: khi encoder quay thuận,dc1 quay nghich, dc2 quay thuận. khi encoder quay nghich thì dc quay ngược lại,encoder dừng thì động cơ dừng .em làm với con ATmega32 ,Em đã viết code bằng code avr , chạy mô phỏng bằng protues, kết quả là khi encoder quay thì động cơ quay theo đúng nhưng khi encoder dừng động cơ vẫn quay ,mong các cao thủ chỉ giúp
đây là đoạn code của em:
#include <mega32.h>
#include <delay.h>
#define xungA PIND.2 //xung a noi vao PIND.2
#define xungB PIND.3 //xung B noi vao PIND.3
#define Hight 1 //muc cao
#define Low 0 //muc thap
#define thuan 1 // chieu thuan
#define nghich 0 // chieu nghich
#define off 0 // khong quay
#define on 1
bit start;
long count=0;
int speed=0;
void dc1_quay_thuan(void)
{
while(speed<255)
{
speed++;
PORTA=0x01;
OCR2=speed;
}
if(speed>255)OCR2=255;
}
void dc1_quay_nghich(void)
{
while(speed<255)
{
speed++;
PORTA=0x02;
OCR2=speed;
}
if(speed>255)OCR2=255;
}
void dc2_quay_thuan(void)
{
PORTB=0x02;
OCR0=255;
}
void dc2_quay_nghich(void)
{
PORTB=0x01;
OCR0=255;
}
void dc_control(void)
{
while(count++)
{
if((xungA==Low)&&(xungB==Low)) // khi ca 2 xung deu muc thap
{
start=off;
}
if((start==off)&&(xungA==Hight)&&(xungB==Low))
//trang thai truoc 2 xung deu muc thap
//xung A tac dong,xung B chua tac dong
//=> chieu quay theo chieu thuan
{
dc2_quay_thuan();// cho motor2 quay thuan
dc1_quay_nghich();// cho motor1 quay theo chieu nghich
start=on; // co quay
}
if((start==off)&&(xungA==Low)&&(xungB==Hight))
//trang thai truoc 2 xung deu muc thap
//xung B tac dong,xung A chua tac dong
//=> chieu quay theo chieu nghich
{
dc2_quay_nghich();//cho motor2 quay nghich
dc1_quay_thuan(); // cho motor1 quay theo chieu thuan
start=on; // trang thai dang quay
}
if((xungA==Hight)&&(xungB==Hight))
//neu ca 2 xung deu tac dong cung muc cao
start=on ; //trang thai nay khong xac dinh chieu quay
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTA=0x00;
DDRA=0x03;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=0 State0=0
PORTB=0x00;
DDRB=0x0B;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x80;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Phase correct PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x63;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Phase correct PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x64;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTA=0x03;
PORTB=0x03;
};
}
interrupt[2]void ext_INT0(void)
{
dc_control();
}
em là dân cơ khí, em đang làm đề tài điều khiển động cơ DC theo encoder cụ thể như sau: khi encoder quay thuận,dc1 quay nghich, dc2 quay thuận. khi encoder quay nghich thì dc quay ngược lại,encoder dừng thì động cơ dừng .em làm với con ATmega32 ,Em đã viết code bằng code avr , chạy mô phỏng bằng protues, kết quả là khi encoder quay thì động cơ quay theo đúng nhưng khi encoder dừng động cơ vẫn quay ,mong các cao thủ chỉ giúp
đây là đoạn code của em:
#include <mega32.h>
#include <delay.h>
#define xungA PIND.2 //xung a noi vao PIND.2
#define xungB PIND.3 //xung B noi vao PIND.3
#define Hight 1 //muc cao
#define Low 0 //muc thap
#define thuan 1 // chieu thuan
#define nghich 0 // chieu nghich
#define off 0 // khong quay
#define on 1
bit start;
long count=0;
int speed=0;
void dc1_quay_thuan(void)
{
while(speed<255)
{
speed++;
PORTA=0x01;
OCR2=speed;
}
if(speed>255)OCR2=255;
}
void dc1_quay_nghich(void)
{
while(speed<255)
{
speed++;
PORTA=0x02;
OCR2=speed;
}
if(speed>255)OCR2=255;
}
void dc2_quay_thuan(void)
{
PORTB=0x02;
OCR0=255;
}
void dc2_quay_nghich(void)
{
PORTB=0x01;
OCR0=255;
}
void dc_control(void)
{
while(count++)
{
if((xungA==Low)&&(xungB==Low)) // khi ca 2 xung deu muc thap
{
start=off;
}
if((start==off)&&(xungA==Hight)&&(xungB==Low))
//trang thai truoc 2 xung deu muc thap
//xung A tac dong,xung B chua tac dong
//=> chieu quay theo chieu thuan
{
dc2_quay_thuan();// cho motor2 quay thuan
dc1_quay_nghich();// cho motor1 quay theo chieu nghich
start=on; // co quay
}
if((start==off)&&(xungA==Low)&&(xungB==Hight))
//trang thai truoc 2 xung deu muc thap
//xung B tac dong,xung A chua tac dong
//=> chieu quay theo chieu nghich
{
dc2_quay_nghich();//cho motor2 quay nghich
dc1_quay_thuan(); // cho motor1 quay theo chieu thuan
start=on; // trang thai dang quay
}
if((xungA==Hight)&&(xungB==Hight))
//neu ca 2 xung deu tac dong cung muc cao
start=on ; //trang thai nay khong xac dinh chieu quay
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTA=0x00;
DDRA=0x03;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=0 State0=0
PORTB=0x00;
DDRB=0x0B;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x80;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Phase correct PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x63;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Phase correct PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x64;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTA=0x03;
PORTB=0x03;
};
}
interrupt[2]void ext_INT0(void)
{
dc_control();
}
Comment