指针应用:
#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++) 注意要用分号
{
}