完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include #define uchar unsigned char #define uint unsigned int ***it en1=P2^0; /* L298的Enable A */ ***it en2=P2^1; /* L298的Enable B */ ***it s1=P2^2; /* L298的Input 1 */ ***it s2=P2^3; /* L298的Input 2 */ ***it s3=P2^4; /* L298的Input 3 */ ***it s4=P2^5; /* L298的Input 4 */ uchar t=0; /* 中断计数器 */ uchar m1=0; /* 电机1速度值 */ uchar m2=0; /* 电机2速度值 */ uchar tmp1,tmp2; /* 电机当前速度值 */ uchar num; /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */ void motor(uchar index, char speed) { if(speed>=-100 && speed<=100) { if(index==1) /* 电机1的处理 */ { m1=abs(speed); /* 取速度的绝对值 */ if(speed<0) /* 速度值为负则反转 */ { s1=0; s2=1; } else /* 不为负数则正转 */ { s1=1; s2=0; } } if(index==2) /* 电机2的处理 */ { m2=abs(speed); /* 电机2的速度控制 */ if(speed<0) /* 电机2的方向控制 */ { s3=0; s4=1; } else { s3=1; s4=0; } } } } void delay(uint j) /* 简易延时函数 */ { for(j;j>0;j--); } void init_t1() { TMOD=0x20;//设置定时器1为工作方式2 TH1=0xfd;//波特率初始值 TL1=0xfd; TR1=1;//定时器打开 REN=1;//允许串行接受 SM0=0;//串行口工作方式设置为1 SM1=1; ES=1; } void main() { char i; TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值 */ TL0=0x9B; ET0=1; /* 定时器0允许中断 */ TR0=1; /* 启动定时器0 */ init_t1(); //定时器1 EA=1; /* 开中断 */ while(1) /* 电机实际控制演示 */ { switch(num) { case 0x61:for(i=0;i<=100;i++) /* 正转加速 */ { motor(1,i); motor(2,i); delay(2000); }; break; //前进 case 0x62: for(i=100;i>0;i--) /* 正转减速 */ { motor(1,i); motor(2,i); delay(2000); } ; break;//左转 case 0x63: for(i=0;i<=100;i++) /* 反转加速 */ { motor(1,-i); motor(2,-i); delay(2000); }; break;//停止 case 0x64: for(i=100;i>0;i--) /* 反转减速 */ { motor(1,-i); motor(2,-i); delay(2000); } ; break;//右转 case 0x65: s1=1,s2=0,s3=1,s4=0;break;//后退 default:break; } } } void t1() interrupt 4//中断服务函数 { if(RI) { RI=0; P2=SBUF; num=SBUF; } } void timer0() interrupt 1 /* T0中断服务程序 */ { if(t==0) /* 1个PWM周期完成后才会接受新数值 */ { tmp1=m1; tmp2=m2; } if(t if(t>=100) {t=0; }/* 1个PWM信号由100次中断产生 */ } |
|
相关推荐
4个回答
|
|
求大神帮帮忙,好难
|
|
|
|
不要沉啊,我搞了几天了
|
|
|
|
用的手机,代码不全
|
|
|
|
没有很仔细看代码,猜测2个原因。1是时间问题,定时器周期和delay函数,如果加速阶段整个周期很短,肉眼是感觉不出来的;2是硬件问题,也和时间有关,电机的转动、停止不是你控制en1、en2它就能立即响应的,试想电机还没减速下来,又进入新一轮减速循环了,而肉眼又看不出有减速的微小变化。建议:
case 0x61:for(i=0;i<=100;i++) /* 正转加速 */ { motor(1,i); motor(2,i); delay(2000); }; break; //前进 这里不要用for循环,可以先设定两个差距较大的值来测试电机的速度变化情况。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
643 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
625 浏览 0 评论
722 浏览 1 评论
528 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
883 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11648 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-9 19:52 , Processed in 0.555309 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号