
正文
c语言驱动电机函数 电机驱动算法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
51单片机怎么驱动直流电机c语言
51单片机驱动直流电机程序(用的是l298n芯片):
#includereg51.h
#includemath.h
#defineuintunsignedint
#defineucharunsignedchar
#defineN100
sbit s1=P1^0;//电机驱动口
sbits2=P1^1;//电机驱动口
sbits3=P1^2;//电机驱动口
sbits4=P1^3;//电机驱动口
sbiten1=P1^4;//电机使能端
sbiten2=P1^5;//电机使能端
sbitLSEN=P2^0;//光电对管最左
sbitLSEN1=P2^1;//光电对管左1
sbitLSEN2=P2^2;//光电对管左2
sbitRSEN1=P2^3;//光电对管右1
sbitRSEN2=P2^4;//光电对管右2
sbitRSEN=P2^5;//光电对管最右
uintpwm1=0,pwm2=0,t=0;
voiddelay(uintxms)
{
uinta;
while(--xms)
{
for(a=123;a0;a--);
}
}
voidmotor(ucharspeed1,ucharspeed2)
{
if(speed1=-100speed1=100)
{
pwm1=abs(speed1);
if(speed10)
{
s1=1;
s2=0;
}
if(speed1==0)
{
s1=1;
s2=1;
}
if(speed10)
{
s1=0;
s2=1;
}
}
if(speed2=-100speed2=100)
{
pwm2=abs(speed2);
if(speed20)
{
s3=1;
s4=0;
}
if(speed2==0)
{
s3=1;
s4=1;
}
if(speed20)
{
s3=0;
s4=1;
}
}
}
voidgo_forward(uintspeed)
{
s1=1;
s2=0;
s3=1;
s4=0;
pwm1=speed;
pwm2=speed;
}
voidgo_back(uintspeed)
{
s1=0;
s2=1;
s3=0;
s4=1;
pwm1=speed;
pwm2=speed;
}
voidstop()
{
s1=1;
s2=1;
s3=1;
s4=1;
pwm1=0;
pwm2=0;
}
voidturn_right(uintP1,uintP2)//右转函数
{
s1=1;
s2=0;
s3=0;
s4=1;
pwm1=P1;
pwm2=P2;
}
voidturn_left(uintP1,uintP2)//左转函数
{
s1=0;
s2=1;
s3=1;
s4=0;
pwm1=P1;
pwm2=P2;
}
voidtracking()
{
if((LSEN1==0)(LSEN2==0)(RSEN1==0)(RSEN2==0))//没有检测到
{
go_forward(100);
}
if((LSEN1==1)(LSEN2==0)(RSEN1==0)(RSEN2==0))//左一检测到
{
turn_left(40,80);//左转右轮》左轮
delay(N);
}
if((LSEN1==0)(LSEN2==1)(RSEN1==0)(RSEN2==0))//左二检测到
{
turn_left(40,60);//左转右轮》左轮
delay(N);
}
if((LSEN1==0)(LSEN2==0)(RSEN1==1)(RSEN2==0))//右一检测到
{
turn_right(60,4);//右转左轮》右轮
delay(N);
}
if((LSEN1==0)(LSEN2==0)(RSEN1==0)(RSEN2==1))//右二检测到
{
turn_right(80,40);//右转左轮》右轮
delay(N);
}
if((LSEN1==1)(LSEN2==1))
{
turn_left(0,100);
delay(1000);
}
if((RSEN1==1)(RSEN2==1))
{
turn_right(100,0);
delay(1000);
}
}
voidavoidance()
{
}
voidinit()
{
TMOD=0x02;//timer0同时配置为模式2,8自动重装计数模式
TH0=156;//定时器初值设置100us中断
TL0=156;
ET0=1;
EA=1;
TR0=1;//开启总中断
}
voidmain()
{
init();
while(1)
{
tracking();
}
}
voidtimer0()interrupt1//电机驱动提供PWM信号
{
if(tpwm1)
en1=1;
else
en1=0;
if(tpwm2)
en2=1;
else
en2=0;
t++;
if(t100)
t=0;
}
扩展资料
L298N是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。
参考资料来源:百度百科-l298n
相关问答
Q1: 怎么用C语言控制步进电机
不清楚您具体采用的什么控制器(PLC或是单片机)和什么步进电机。
这里当着您使用的是单片机与5线4相电机
通常情况下控制单片机的4个IO口,使其都为高电平。
再按照一个方向轮流使其中一个IO口变为低电平(间隔这里先为2ms,修改间隔时间可以控制转速),就可以驱动步进电机转起。
Q2: 求两相四线步进电机驱动,C语言源码,可以控制步数的。
#include stdio.h #include fcntl.h #include string.h #include sys/ioctl.h
#define STEPMOTOR_IOCTRL_PHASE 0x13 staticintstep_fd = -1;
char *STEP_DEV="/dev/exio/0raw"; //定义一个指针指向步进电机c语言驱动电机函数的驱动 程序
/********* A, AB, B, BC, C CD, D, DA ***/
char stepdata[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//各 个相位对应的值
void Delay(int t) //延时函数 { int i;
for(;t0;t--)
for(i=0;i400;i++); }
/***************************************************** ***********/
int main(intargc, char **argv) {
int i = 0;
if((step_fd=open(STEP_DEV, O_WRONLY))0){ printf("Error opening /dev/exio/0raw device\n"); return 1; } /*
打开设备的驱动程序,由于LINUX把所有的设备都模拟成文件。 step_fd=open(STEP_DEV,0_WRONLY)实际调用的函数为:
staticint s3c2410_exio_open(structinode *inode, struct file *filp) //驱动程序中的设备打开程序 */
for (;;) {
for (i=0; isizeof(stepdata)/sizeof(stepdata[0]); i++) { ioctl(step_fd, STEPMOTOR_IOCTRL_PHASE, stepdata[i]); }
/*程序进入一个死循环,这样可以使电机在没有人为停止的状况下,一直的 转动下去。
*第二层for语句循环一次即电机转动一周。函数ioctl()对应函 数*s3c2410_exio_ioctl()
*而这个函数最终将调用函数do_stepmotor_run((char)arg);使步进电 机转动起来。 */
printf("Delay(100)\n"); Delay(100); }
close(step_fd); //程序结束时关闭设备 printf("Step motor start running!\n"); return 0; }本文来自百度文库,c语言驱动电机函数你可以搜搜,其中答案更详细的c语言驱动电机函数!
c语言驱动电机函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于电机驱动算法、c语言驱动电机函数的信息别忘了在本站进行查找喔。






