
而在函数内容中,你根据传递过来的参数值,去调整控制各个电机的脉冲频率就OK了。
例如,如果你是用定时器+普通IO口做的脉冲输出,那么你可以调整定时时间,就调整了输出频率,就调整了转速。
在车轮上装上编码器,在STM32上使用计数器计算脉冲数,进而计算轮子转速。例如,编码器与车轮同轴,并且编码器为500线。这样,轮子转一圈,编码器就会转一圈,编码器转一圈就会产生500个脉冲,通过stm32计算1s内的脉冲数,除以500就可以得到车轮转速。
你好,先给个程序,下面这个程序肯定是没问题的,你看看拷进去能不能同速运行,如果还不能的话,看一下你的车子是不是那种传动结构很多的(一个轮子与电机之间3个齿轮以上就算是了),是的话,调整一下齿轮等的结合让两个轮子的摩擦力什么的相同就行了,一般情况下这种车很难调整的。肯定有效的解决方法是买个码盘,也不贵呗,加个自动调速系统(简单的比较一下转速,然后用if语句调整PWM占空比就好了)可以保证走直线。程序如下:#include<reg51.h>
/*定义按键和L298N引脚*/
sbit BZ1=P0^0 sbit IN1=P2^0
sbit BZ2=P0^1 sbit IN2=P2^1
sbit BF1=P0^2 sbit IN3=P2^2
sbit BF2=P0^3 sbit IN4=P2^3
sbit BJIA1=P0^4
sbit BJIA2=P0^5
sbit BJIAN1=P0^6
sbit BJIAN2=P0^7
/*函数声明*/
void delay(t)
void Z1()
void Z2()
void F1()
void F2()
void JIA1()
void JIA2()
void JIAN1()
void JIAN2()
void change()
char W=0//W用来在调速状态下选择电机;
int t1=80,t2=80
/*延时函数*/
void delay(int t)
{while(t--)}
/*正转函数1*/
void Z1()
{IN1=1IN2=0W=1}
/*正转函数2*/
void Z2()
{IN3=1IN4=0W=1}
/*反转函数1*/
void F1()
{IN1=0IN2=1W=2}
/*反转函数2*/
void F2()
{IN3=0IN4=1W=2}
/*加速函数1*/
void JIA1()
{t1+=10}
/*加速函数2*/
void JIA2()
{t2+=10}
/*减速函数1*/
void JIAN1()
{t1-=10}
/*减速函数2*/
void JIAN2()
{t2-=10}
/*停止*/
void TING()
{IN1=IN2=IN3=IN4=0}
/*制动函数*/
void ZHI()
{IN1=IN2=IN3=IN4=1}
/*按键信号*/
void change()
{
if(BZ1==0){Z1()delay(t1)TING()delay(255-t1)}
if(BZ2==0){Z2()delay(t2)TING()delay(255-t2)}
if(BF1==0){F1()delay(t1)TING()delay(255-t1)}
if(BF2==0){F2()delay(t2)TING()delay(255-t2)}
if(BJIA1==0&&t1<235){delay(5)JIA1()}
if(BJIA2==0&&t2<235){delay(5)JIA2()}
if(BJIAN1==0&&t1>80){delay(5)JIAN1()}
if(BJIAN2==0&&t2>80){delay(5)JIAN2()}
if(BZ1==0&&(BZ2!=0&&BF1!=0&&BF2!=0)){delay(255)}
if(BZ2==0&&(BZ1!=0&&BF1!=0&&BF2!=0)){delay(255)}
if(BF1==0&&(BZ1!=0&&BZ2!=0&&BF2!=0)){delay(255)}
if(BF2==0&&(BZ1!=0&&BZ2!=0&&BF1!=0)){delay(255)}
}
/*主程序*/
void main()
{
P0=0xff
while(1)
{change()}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)