查看: 2402|回复: 5
|
89s52 .. set PWM如何同时用TMOD mode2 在servo motor 和DC motor..
[复制链接]
|
|
我的MCU 是89s52....要如何用同时control servo motor 和DC Motor(with PWM的)
假如我用P3_0 for sensor input,
0 = servo motor turn 150 degree, DC motor PWM 100% duty cycle
1 = servo motor turn 30 degree, DC motor PWM50% duty cycle......
我用TMOD=0x11 mode 1
我的code能turn servo motor 150和30 degree ...
但是DC motor拿不到PWM, 不知道要怎样放interrupt。。
大家帮帮忙。。。。
#include <REGX52.h>
///////////DC motor///////
move(){
if(P3_0 == 1){
P1_1 = 1; //enable
P1_2 = 1; //move forward
P1_3 = 0;
TH0=0x63;
TL0=0xC0;
P1_1=0;
TR0=0;
}
else{
P1_1 = 1; //enable
P1_2 = 1; //move forward 50% duty cycle
P1_3 = 0;
TH0=0xB1;
TL0=0xE0;
P1_1=0;
TR0=0;
}
}
////////////////servo motor////////////
void timer1_ovf() interrupt 2{ // timer 1 for 20ms
TH1=0xB1;
TL1=0xE0;
P1_0=1; //servo motor enable
TR0=1;
}
void timer0_ovf() interrupt 1{ // timer 0 for various shaft position
if(P3_0==0 ){
TH0=0xF7; //turn right to 150 degree (2100us)
TL0=0xCC;
P1_0=0; //servo motor enable
TR0=0;
}
else if(P3_0==1){
TH0=0xFC; //turn right to 30 degree (900us)
TL0=0x7C;
P1_0=0; //servo motor enable
TR0=0;
}
}
void main(){
TMOD=0x11;
ET1=1;
ET0=1;
TH1=0xB1;
TL1=0xE0;
TR1=1;
EA=1;
while(1){
move();
}
} |
|
|
|
|
|
|
|
发表于 7-4-2009 02:16 PM
|
显示全部楼层
mmu fyp?
回复你之前,想知道你的concept.
你要如何generate pulse给servo?
你要如何generate pwm给dc motor? |
|
|
|
|
|
|
|
楼主 |
发表于 7-4-2009 05:17 PM
|
显示全部楼层
回复 2# fritlizt 的帖子
是的。。。关于line follewer。。。因为我用servo motor来control direction, DCmotor 是forward and backward..
上面的code是用来testing 的。。。我用timer 0 和 timer 1 mode 1 for servo motor, 但不知道怎样同时generate pwm给dc motor。 |
|
|
|
|
|
|
|
发表于 8-4-2009 10:47 AM
|
显示全部楼层
原帖由 j4_c 于 7-4-2009 05:17 PM 发表
是的。。。关于line follewer。。。因为我用servo motor来control direction, DCmotor 是forward and backward..
上面的code是用来testing 的。。。我用timer 0 和 timer 1 mode 1 for servo motor, 但不知道怎样同 ...
用两个timer来generate pulse给servo太浪费了。
最快有两个方法。
1。89s52有两个timer.用timer2来generate pwm给dc motor
2。用timer 0 generate pulse 给servo. timer 2 给dc motor. timer 1留着。 有必要才用 |
|
|
|
|
|
|
|
楼主 |
发表于 8-4-2009 08:10 PM
|
显示全部楼层
回复 4# fritlizt 的帖子
谢谢你的回复。。
我不知道servo 的generate pulse用一个timer 就可以了。。。
我写了另一个 code 给servo motor的,用timer 0,但是还是不能跑。。。不知道哪里出错了。。
#include <REGX52.h>
void main(){
TMOD=0x01;
ET0=1;
TH1=0xB1; //initial timer 0 for 20ms
TL1=0xE0;
TR0=1; //on timer 0
P1_0=1; //enable servo motor
EA=1; //enable interrupt
while(1){
}
}
void timer0_ovf() interrupt 1{
if(P3_0==0 ){
TH0=0xF7; //turn right to 150 degree (2100us)
TL0=0xCC;
TR0=1; //on timer 0
while(!TF0); //timer 0 overflow
TR0=0; //off timer 0
TF0=0; //clear overflog flag
}
else if(P3_0==1 ){
TH0=0xFC; //turn right to 30 degree (900us)
TL0=0x7C;
TR0=1; //on timer 0
while(!TF0); //timer 0 overflow
TR0=0; //off timer 0
TF0=0; //clear overflog flag
}
} |
|
|
|
|
|
|
|
发表于 9-4-2009 01:09 PM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|