作者mick99988 (高雄人)
看板ASM
标题Re: [问题] 想问关於89S52去控制伺服马达相关问题
时间Mon Oct 26 23:05:30 2015
※ 引述《WolfLord (呆呆小狼)》之铭言:
: ※ 引述《mick99988 (高雄人)》之铭言:
: : 不过89S52只有3组Timer够给4个PWM给4个Servo马达吗?
: 你会写,一个T1或T0就够你输出8~16的PWM了,而且还很精准(之前在板上有写
: 过范例,但是好像不见了)
: 其实,一个8051就能做很多事了,操控个四轴机械手臂其实还很闲。
: 事实是你的创造力有多大MCU就有多强大,而不是MCU有些什麽你才能
: 做些什麽。
: 机械的动作都是以mS为单位的,一个24Mhz的8052指令是用500nS的速
: 度在跑。除非你的程式写得跟破抹布一样,不然为什麽会需要用到16
: 或32Bit的MCU才够快??
今天在网路上找用中断产生PWM的写法,发现很多文章都套用这个
unsigned int dutytime=20000; //65536-45536就是责任周期
unsigned int ton=1280; //高电位比例=50% <----这边的高低电位为什麽要这样设?
unsigned int toff=20000-1280; //低电位比例=50% 不会很多此一举吗
unsigned int temp; //给计时器工作用
void Timer0_init(void) //初始化计时器0
{
EA=0; //关闭中断功能(所有中断副程式失效)
IE|=0x02; //开启计时器中断功能
TMOD|=0x01; //设定计时器模式
temp=65536-dutytime; //设定中断一次的时间(预设是dutytime)
TH0=temp/256; //填入高八位
TL0=temp%256; //填入低八位
TR0=1; //启动计时器
EA=1; //开启中断功能(中断副程式可以执行)
}
void main(void) //主程式开始
{
Timer0_init();
P3=0xff;
while(1)
{
if(P3_0==0){
ton=420;
toff=20000-ton;
}
if(P3_1==0){
ton=671;
toff=20000-ton;
}
if(P3_2==0){
ton=923;
toff=20000-ton;
}
if(P3_3==0){
ton=1174;
toff=20000-ton;
}
跟我在课本上范例解取部分
main()
{
TMOD=0x01;
TH0=(65536-92)/256; 产生每100us中断一次
TL0=(65536-92)%256;
IE=0x82;
TR0=1;
while(1)
{
s1=15;
delay_ms(1000);
}
}
想问的是都直接把设定写在这里跟另外用一个副程式去初始化有何不同?
然後是不懂他们所说的Dutytime是做什麽的?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.175.110.116
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/ASM/M.1445871933.A.509.html
※ 编辑: mick99988 (1.175.110.116), 10/26/2015 23:26:34
1F:推 chuegou: 会这样写主要是为了看懂.修改时不易改错 10/27 01:28
2F:→ chuegou: 副程式再次呼叫比较方便 10/27 01:30
3F:→ chuegou: duty你就想像成水龙头,开越大水越多 10/27 01:31
4F:→ chuegou: 通常目标是马达转越快,当然也可以拿去加热器或power用 10/27 01:33