去年比赛培训的时候做的一个小东西,现在整理了出来和大家分享。
本设计采用STC12C5A60S2单片机作为主控芯片实现了PID电机调速控制器。传感器采用欧姆龙的200线编码器。电机驱动模块采用L298N,使用LM2596来对电机供电。设计中的重点是电机转速的获取和基于PID的电机控制算法的实现。
[mw_shl_code=c,true]//******************频率测量函数*****************
void hight_frequency()
{
h_count=0; //脉冲计数初值为0
EX0=1; //INT0中断允许,开始计数
TR1=1; //启动定时器1
while(EX0); //等待外部中断0关闭
TR1=0; //关T1中断
h_count=(h_count-1)*50; //得到实际频率,因为定时器计数的是20ms的个数所以此处乘50,即为1s
Speed=h_count/200; //获取电机转速,此处采用200线编码器
if((Speed>300)||(Speed<0))
Speed=0;
SpeedTable[0]=0x30+(Speed/100);
SpeedTable[1]=0x30+(Speed%100/10);
SpeedTable[2]=0x30+(Speed%10);
SpeedTable[3]=0x20;
}
[/mw_shl_code]
[mw_shl_code=c,true]/*****INT0中断函数***/
void Int0_Routine(void) interrupt 0
{
h_count++; //高频计数脉冲加1
}
[/mw_shl_code]
[mw_shl_code=c,true]//**************内部定时器T1中断******
void Timer1_Routine() interrupt 3
{
TH1=0xb1;
TL1=0xe0; //重装初值
EX0=0; //20ms定时结束,停止计数
}[/mw_shl_code]
[mw_shl_code=c,true]//**********PID算法******
long int PID(int setpoint,int achieved)
{
long int result,TempResult;
en=setpoint-achieved;
ErrorNum=p*en-i*(en-en1)+d*(en1-en2);
TempResult=(long int)(ErrorNum/20);
result=TempResult;
en2=en1;
en1=en;
return result;
}
[/mw_shl_code]
STC12C5A60S2主控板
焊接完成后的主控板
传感器和电机连接部分,直接上胶枪,简单粗暴!
运行中的12864显示结果
|