STC12C56xxAD芯片用pwm调速程序的代码如下:
sbit k1=P3^4;
sbit k2=P3^5;
void delay(unsigned int cnt)
{
unsigned char i;
for(;cnt>0;cnt--)
for(i=0;i<250;i++);
}
void main()
{
CCON=0; //PCA初始化
CL=0; //PCA的16位计数器低八位
CH=0; //PCA的16位计数器高八位
CMOD=0x00; //选择 系统时钟/12 为计数脉冲,则PWM的频率f=sysclk/256/12;
CCAP0H=0x80; // 占空比控制
CCAP0L=0x80;
PCA_PWM0=0x00; //控制占空比的第九位为0
CCAPM0=0x42; //允许P13作为PWM输出
CR=1; //启动PCA计数器
while(1)
{
if(k1==0)
{
delay(200);
while(k1==0);
CCAP0H+=5; //占空比调节
CCAP0L+=10;
}
if(k2==0)
{
delay(200);
while(k2==0);
CCAP0H-=5; //占空比调节
CCAP0L-=5;
}
}
}
可以运行,但很容易出问题,单片机运行不稳定。万一有电磁干扰,就很容易出问题。复位电路的作用是:当供电电源波动的时候,单片机的运行会受到影响可能会胡乱执行程序。这时候需要有复位电路给以软启动,让单片机从新执行。以最大限度正常运行。或者说复位电路加上按钮, *** 作者想让它重启就重启。/时序调试可以用定时器,首先把准确的时序调好,然后是在wendu()函数里的复位函数while(dsreset());之后有一定的延时;就行了,我的ds18b20接的是单片机P1^7口,之前也是挑不出来,最后就是在复位函数while(dsreset());之后加了个延时才出来的。另外我用的是lcd1602显示/
#include <reg51h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit dq=P1^7;
sbit rs=P3^7;
sbit rw=P3^6;
sbit en=P2^7;
uchar num;
uchar flag;
void delay1(uint z)
{
while(z--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
///////////////lcd1602////////////////////////////
void write_com(uchar com)
{
rw=0;
rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_dat(uchar dat)
{
rw=0;
rs=1;
P0=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void lcdinit()
{
rw=0;
en=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x80);
}
////////////////ds18b20//////////////////////////////////////
uchar dsreset(void) //18B20复位,初始
{
uchar i;
dq=0;
flag=0;
TH0=0xfa;
TL0=0xf6;
TR0=1;
while(!flag);
dq=1;
i=dq;
TH0=0xff;
TL0=0x91;
TR0=1;
flag=0;
while(!flag);
i=dq;
return i;
}
void ds18b20xie_byte(uchar dat)
{
uchar i,j;
for(i=0;i<8;i++)
{
dq=0;
_nop_();
dq=dat&0x01;
flag=0;
TH0=0xff;
TL0=0x48;
TR0=1;
while(!flag);
dq=1;
dat>>=1;
}
}
uchar ds18b20du_byte()
{
uchar i,dat=0;
dq=1;
_nop_();
for(i=0;i<8;i++)
{
dq=0;
_nop_();
dat>>=1;
dq=1;
_nop_();
_nop_();
_nop_();
if(dq) dat=dat|0x80;
flag=0;
TH0=0xff;
TL0=0xa4;
TR0=1;
while(!flag);
dq=1;
}
return dat;
}
void wendu()
{
uchar i,j;
int time,time1;
while(dsreset());
dq=1;
delay(200);//////////////要有一定的延时
ds18b20xie_byte(0xcc);
ds18b20xie_byte(0x44);
delay(2);///////////要有一定的延时
while(dsreset());
delay(20000);
ds18b20xie_byte(0xcc);
ds18b20xie_byte(0xbe);
i=ds18b20du_byte();
j=ds18b20du_byte();
time=i+j256;
if(time<0)
{
write_com(0x80);
write_dat('-');
time=0-time;
}
else write_dat('+');
time1=time>>4;
time=time&0x000f;
time=time0625;
write_com(0x81);
write_dat(time1/100+0x30);
write_com(0x82);
write_dat(time1%100/10+0x30);
write_com(0x83);
write_dat(time1%10+0x30);
write_com(0x84);
write_dat('');
write_com(0x85);
write_dat(time+0x30);
}
/////////////////////////////////////////////////////////////////
void main()
{
TMOD=0x01;
EA=1;
ET0=1;
while(1)
{
lcdinit();
wendu();
write_dat('a');
}
}
void timer0() interrupt 1
{
flag=1;
TR0=0;
}问题一:如何控制步进电机??? 步进电机动作的话要靠驱动器来驱动的,步进电机也叫脉冲电机,给一个脉冲转一个角度。12V的话要控制要先买个开关电源,把220V变成12V接到驱动器,再用驱动器控制电机,还要一个外部给脉冲的控制器(单片机或者PLC)给驱动器脉冲信号、
问题二:如何控制步进电机 看下你年纪,假设你没学过步进电机和单片机,所以,需要学习的东西主要就是步进电机的简单的原理,这个可能学的很快,因为它挺直观;还有就是学单片机,这个就不好说了,网络上有众多的类似10天学会XXX,21天征服XXX的教程。
通过单片机驱动步进电机还是挺简单的,就像在淘宝上随便一搜,就能找到这样的驱动,很入门
问题三:怎么用PLC控制步进电机定距离转动 1、18度的5细分就是036度,1000个脉冲转一周。
2、步进电机皮带轮直径5cm ,周长就是157cm。
3、18度的5细分每一个脉冲走多少157/1000=00157cm。
4、走15cm需要多少脉冲 15/00157=955414。
5、Fx2n系列PLC有一条脉冲输出指令PLSY,指令的格式是PLSY K10000 K955 Y001 ,意思是用10000HZ的频率,将955个脉冲由Y1输出,这样就能走约15cm的距离。
想详细的了解程序,可以在网上搜我的用户名,有盯的联系方法。记得把分给了。
问题四:如何实现步进电机控制中的点动功能 电机为什么总要加速减速呢?是因为你的设备的需要吧。点动速度恒定,缓动不是也挺好吗?就是慢点吧,还安全用2个PLS实现停止没问题。正如你所说,PLS之间没有突变就行。你可以把PLS指令想象成实际电机的动作情况就行了,指令发出电机执行还得时间呢。所以用2个PLS实现,从电机上是不会有什么影响的,就相当于多段包洛吧。至于怎么得出终止频率那就得看你前面的程序是怎么让他加速的了。还有高速计数是用反应的什么量,我不太清楚,请指点以上纯属新手看法,望指正!
问题五:请问怎样控制步进电机一步一步地走?? 步进电机的旋转是以固定的角度(称为“步距角”)一步一步运行的, 其特点是没有积累误差(精度为100%), 所以广泛应用于各种开环控制。控制系统每发一个脉冲信号, 通过驱动器就使步进电机旋转一步距角。所以步进电机的转速与脉冲信号的频率成正比。控制步进脉冲信号的频率,可以对电机精确调速;控制步进脉冲的个数,可以对电机精确定位目的。
问题六:步进电机基本控制方法? 可以用单片机+全集成步进电机驱动芯片来整全应用,这样比较简单,控制上很方便。用普通的51单片机像AT89C2051或STC12C1052 + THB7128或THB6064这类芯片来组合就可以了
单片机根据输入来决定输出的脉冲数量,让步进电机驱动芯片转化成功率信号驱动步进电机。
因为是一个脉冲走一步的,所以输出的脉冲数还要考虑到细分数的问题,固定转动步数、角度的程序还是比较容易编。像18度的步进电机,2细分时,转一圈就需要400个脉冲,转半圈只需要200个脉冲,转90度只需要100个脉冲,如此类推。
程序的话,固定一个适当的频率,按键触发启动定时器,然后在定时中断里取反一个IO端口做脉冲输出,再放入一个累加变量做计算,算脉冲数量,是取反两次输出一个完整的脉冲,在主程序中设定一个需要的脉冲数量来作为条件控制定时器的开启和关闭,然后循环等待条件满足
如果想把控制、驱动、和步进电机都整合在一起,比较麻烦,小电机还好,大电机的干扰是个问题
问题七:步进电机是如何实现位置控制的 哈!你如想精确的得到位置控制这可不只是步进电机和你控制电路的事了,因步进电机的失步可是一个常见事了并也是个不好处理的难题。这只有在控制方法上下功夫憨可能减少到最低限,如你想精确的位置控制最好还是采用有闭环回路的方案。
因这步进电机的控制就是通过给的脉数和这个步进电机的步角度的乘积再换算到你的执行机构上去。哈!只怕碰上阻力大时就会出现你给了脉冲可它转不动而失步的现象了。
问题八:接近开关如何控制步进电机的停止和运行? 自认为停止方式有以下两种:
1利用控制步进电机的微控制器(如单片机,PLC等)检测接近开关的的输出信号。当接近开关触发时,给微控制器一个信号,微控制器停止发出步进电机所需的脉冲指令。步进机就停了。
2接近开关,通过相应的接口电路,接到步进电机驱动器的使能端。接口电路的设计时,只是做相应的电平与逻辑的匹配。
问题九:如何用电脑控制步进电机 一个典型的控制系统是由控制部分驱动部分执行部分组成
步进电机只是个执行部件在它上面还需要一个驱动部分再往上还需要一个控制部分
现在的步进电机驱动部分大部分都是接受脉冲信号的而电脑是不能发送脉冲信号所以一般在电脑上有安装运动控制卡的或是其他能发送脉冲信号的部件
问题十:步进电机控制怎样才能不丢转 要想保证步进电机控制不丢转,首先要保证到达步进电机的控制脉冲按照时序一个接一个地经过步进电机的每个绕组,如果控制脉冲的时序中有一个脉冲丢失,或者脉冲电压幅度不够,就会出现步进电机控制丢转现象。设定一个时间变量,放在定时中断中。
例:
在主程序中,当时间大于1秒时,串口一收发,
大于2秒时,串口2收发。
注意波特率,1秒左右完成的话,25个字节收发 2400BOADRATE 是没有问题的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)