PWM差速电机

指针应用:

#include<stdio.h>
void main()
{
	int arr[6];
	int *p,i;
	p=arr; 
	printf("please input the number:\n");
	for (i=0;i<6;i++)

	scanf("%d",&arr[i]);
	
	for (i=0;i<6;i++)
	{
		printf("the result1 is: %10d\n",arr[i]);/* code */
		printf("the result1 is: %10d\n",*(p+i));/* code */
	}
 
}

直流电机驱动电路:

 PID驱动,H桥驱动,大功率器件直接驱动

 PWM电机调速:

 PWM电机调速定时器设定10us,整个pwm周期1ms时电机有延时:(PWM频率过高)

PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过改变脉冲信号占空比来控制电机速度的技术。当设定定时器为每10微秒发送一次宽度可变的脉冲,而整个PWM周期是1毫秒(即1000微秒),这意味着每个完整的周期内会发出100次这样的脉冲。

如果电机存在一定的启动延时,这通常是指从接收到第一个PWM信号到电机实际开始响应的时间。这个延时可能由于电机内部构造、电子控制器的处理时间以及电路元件的延迟等因素造成。当你设置的PWM频率很高(如1kHz),而电机的响应跟不上这个频率,就可能导致电机在开始阶段有一个明显的滞后,直到积累到足够的脉冲宽度才能达到预期的速度。

解决这个问题的办法可以包括:

1. 调整PWM频率,给电机足够的时间响应。
2. 确保控制系统有足够的滤波和校准时间。
3. 检查并优化电路设计以减少延迟。

 电机调速代码:

#include <REGX51.H>
#include "Delay.h"
#include "Nixie.h"
#include "Timer0.h"
#include "Key.h"

sbit Moto =P1^0;


unsigned char Counter,Compare;
unsigned char KeyNum,Speed;


void main()
{
	Timer0_Init();
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)
		{
			Speed++;
			Speed%=4;
			if(Speed==0){Compare=0;}
			if(Speed==1){Compare=50;}
			if(Speed==2){Compare=70;} 
			if(Speed==3){Compare=100;}
			
		}
		Nixie(1,Speed);
	}
}
void Timer0_Routine() interrupt 1   //中断跳转程序
{ 
	TL0 = 0xF6;		//设置定时初值定时10us
	TH0 = 0xFF;		//设置定时初值	 
	Counter++;
	Counter%=100;  //count小于100时,这种表示也是可以的
	if(Counter<Compare)
	{
		Moto=1;	//输出1
	}
	else
	{
		Moto=0;
	}
}

电机差速运行之Timer0设置:

#include <REGX52.H>
#include "Go_Qidong.h"
unsigned char Counter0=0;
unsigned char Speed_Left=0;
 

void Timer0_Init(void)		//0.5MS@12.000MHz
{

	TMOD &= 0xF0;		//设置定时器模式
	TMOD |=0x01;		//设置定时器模式
	TL0 = 0x33;		//设置定时初值0.5MS
	TH0 = 0xFE;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;//中断配置,注意最后两句要自己加上
	EA=1;//中断配置

	ES=1;
}
 void Timer0_Routine() interrupt 1   //中断跳转程序
{ 
	TMOD=0x01;		//why
	TL0 = 0x33;		//设置定时初值0.5MS
	TH0 = 0xFE;		//设置定时初值	 
 
	Counter0++;
	Counter0%=40;
	if(Counter0<Speed_Left)
	{
		 Go_LeftForward();	//前进速度减半
	}
	else
	{
		Go_LeftStop();
	}

}

 电机差速运行之Timer1设置:

#include <REGX52.H>
#include "Go_Qidong.h"

 
unsigned char Counter1=0;
unsigned char Speed_Right=0;
void Timer1_Init(void)		//500微秒@11.0592MHz
{
	 
	TMOD &= 0x0F;			//设置定时器模式
	TMOD |= 0x10;			//设置定时器模式
	TL1 = 0x33;				//设置定时初始值
	TH1 = 0xFE;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1=1;
	EA=1;
	ES=1;
}
 void Timer1_Routine() interrupt 3   //中断跳转程序
{ 
	TMOD=0x10;
	TL1 = 0x33;		//设置定时初值0.5MS
	TH1 = 0xFE;		//设置定时初值	 
 
	Counter1++;
	Counter1%=40;
	if(Counter1<Speed_Right)
	{
		 Go_RightForward();	 //前进速度减慢
	}
	else
	{
		Go_RightStop();
	}

}

 Timer1设置注意事项:

1.注意要开启中断

2.中断里面要区分好TL0、TL1、TH0、TH1

3.差速调节转弯时发现定时器1控制的电机运行过程中发生抽抽,运动不连贯,查询代码发现TL0、TH0没有更改为TH1、TL1。

 注意事项:

 if(i<4)直接加一句话不加分号,或者加个大括号,添加好几段话

for(i=0;i<5;i++)                注意要用分号

{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值