📄 main.c
字号:
///========================================================
// 工程名称: DC_SpeedCtrl
// 功能描述: 直流电机速度测量与调节
// 涉及的库: CMacro1016.lib
// 组成文件: main.c
// isr.asm, Mychar, Key.asm, DCMotor.asm
// SPLC501User.c,DataOSforLCD.asm, Key.inc, DCMotor.inc, SPCE061A.inc
// ,Key.h, DCMotor.h, SPCE061A.h
//========================================================
// 文件名称: main.c
//========================================================
#include "SPCE061A.h"
#include "DCMotor.h"
#include "Key.h"
#include "a2000.h"
#include "SPLC501User.h"
#include "Mychar.h"
#define SPEED_MAX 60
#define SPEED_MIN 20
#define SPEED_STEP 2
#define CP 8
#define CI 3
#define CD 1
#define M_RX_FLAG 0x80
#define M_TX_FLAG 0x40
unsigned int g_Direction, g_Speed;
unsigned int uiRS_Buff;
unsigned int uiRS_ReciveFlag;
void playspeed(unsigned int TempNum);
void InitUART(void)
{
unsigned int iTest;
iTest = *P_IOB_Dir;
iTest &= 0xff7f;
*P_IOB_Dir = iTest;
iTest = *P_IOB_Attrib;
iTest |= 0x0080;
*P_IOB_Attrib = iTest;
*P_UART_BaudScalarLow = 0x00;
*P_UART_BaudScalarHigh = 0x05;
*P_UART_Command1 = 0x00;
*P_UART_Command2 = 0x80;
}
void DelayMS(unsigned ms)
{
unsigned i;
while(ms--)
{
for(i = 0; i < 1044; i++)
*P_Watchdog_Clear = 1;
}
}
void System_Init(void)
{
*P_SystemClock = C_Fosc_49M|C_StrongMode;
DCMotor_Init();
Key_Init();
g_Direction = 1;
g_Speed = 40;
LCD501_Init(0x00);
LCD501_Circle(30,30,30,1);
DelayMS(200);
LCD501_SetPaintMode(3);
LCD501_Line(1,30,127,30);
DelayMS(200);
LCD501_Bitmap(0,15,(unsigned int *)encoding_02);
LCD501_Bitmap(16,15,(unsigned int *)encoding_03);
LCD501_Bitmap(32,15,(unsigned int *)encoding_12);
LCD501_Bitmap(48,15,(unsigned int *)encoding_13);
DelayMS(2000);
DelayMS(1000);
LCD501_ClrScreen(0);
LCD501_SetPaintMode(0);
LCD501_Bitmap(2,0,(unsigned int *)encoding_00);
LCD501_Bitmap(35,0,(unsigned int *)encoding_01);
LCD501_Bitmap(68,0,(unsigned int *)encoding_02);
LCD501_Bitmap(101,0,(unsigned int *)encoding_03);
LCD501_Bitmap(2,48,(unsigned int *)encoding_04);
LCD501_Bitmap(35,48,(unsigned int *)encoding_05);
LCD501_Bitmap(68,48,(unsigned int *)encoding_06);
LCD501_Bitmap(101,48,(unsigned int *)encoding_07);
InitUART();
}
const unsigned int DigNum[]={'0','1','2','3','4','5','6','7','8','9'};
void DispNum(unsigned int Num)
{
unsigned int TempNum = Num, k;
if(Num>=10000)
{
k = TempNum/10000;
LCD501_PutChar(30,24,DigNum[k]);
TempNum = TempNum - k * 10000;
}
if(Num>=1000)
{
k = TempNum/1000;
LCD501_PutChar(44,24,DigNum[k]);
TempNum = TempNum - k * 1000;
LCD501_PutChar(60,24,'.');
}
if(Num>=100)
{
k = TempNum/100;
LCD501_PutChar(70,24,DigNum[k]);
TempNum = TempNum - k * 100;
}
if(Num>=10)
{
k = TempNum/10;
LCD501_PutChar(80,24,DigNum[k]);
TempNum = TempNum - k * 10;
}
LCD501_PutChar(90,24,DigNum[TempNum]);
}
void DIGclear(void)
{
LCD501_PutChar(90,24,' ');
LCD501_PutChar(80,24,' ');
LCD501_PutChar(70,24,' ');
LCD501_PutChar(60,24,' ');
LCD501_PutChar(50,24,' ');
LCD501_PutChar(44,24,' ');
LCD501_PutChar(30,24,' ');
}
int DCMotor_Speed_PID(int SetSpeed, int CurSpeed)
{
int e0, u0;
static int u1 = 0;
static int e1 = 0, e2 = 0;
e0 = SetSpeed - CurSpeed;
u0 = u1
+ CP * (e0 - e1)
+ CI * e0
+ CD * (e0 - e1 - e1 + e2);
if(u0 > 1023) u0 = 1023;
if(u0 < 16) u0 = 16;
u1 = u0;
e2 = e1;
e1 = e0;
return u0>>4;
}
void SetSpeed(void)
{
unsigned int KeyCode;
while(1)
{
DispNum(g_Speed);
DelayMS(200);
DIGclear();
DelayMS(200);
DispNum(g_Speed);
KeyCode = Key_Get();
switch(KeyCode)
{
case KEY_1:
g_Speed += SPEED_STEP;
if(g_Speed > SPEED_MAX)g_Speed = SPEED_MIN;
DispNum(g_Speed);
break;
case KEY_2:
g_Speed -= SPEED_STEP;
if(g_Speed < SPEED_MIN)g_Speed = SPEED_MAX;
DispNum(g_Speed);
break;
case KEY_3:
DispNum(g_Speed);
return;
default:
break;
}
}
}
void SetDirection(void)
{
unsigned int KeyCode;
while(1)
{
LCD501_ClrScreen(0);
LCD501_Bitmap(2,48,(unsigned int *)encoding_0E);
LCD501_Bitmap(35,48,(unsigned int *)encoding_0F);
LCD501_Bitmap(68,48,(unsigned int *)encoding_10);
LCD501_Bitmap(101,48,(unsigned int *)encoding_11);
LCD501_Line(0,18,127,18);
if(g_Direction==1)
{
LCD501_Bitmap(10,0,(unsigned int *)encoding_08);
LCD501_Bitmap(30,0,(unsigned int *)encoding_09);
LCD501_Bitmap(50,0,(unsigned int *)encoding_0A);
DelayMS(300);
}
if(g_Direction==-1)
{
LCD501_Bitmap(60,0,(unsigned int *)encoding_0B);
LCD501_Bitmap(80,0,(unsigned int *)encoding_0C);
LCD501_Bitmap(100,0,(unsigned int *)encoding_0D);
DelayMS(300);
}
KeyCode = Key_Get();
switch(KeyCode)
{
case KEY_1:
g_Direction = 1;
break;
case KEY_2:
g_Direction = -1;
break;
case KEY_3:
return;
default:
break;
}
}
}
void StartMotor(void)
{ unsigned int Temp;
unsigned int KeyCode;
unsigned int SpeedLevel, CurSpeed=0, PreSpeed=0;
if(g_Direction==1)
DCMotor_Forward(MOTOR_1+MOTOR_2);
else
DCMotor_Backward(MOTOR_1+MOTOR_2);
DIGclear();
DispNum(CurSpeed);
while(1)
{
if(CurSpeed != PreSpeed)
{
DispNum(CurSpeed);
PreSpeed = CurSpeed;
}
if(DCMotor_IsSpeedRdy())
{
CurSpeed = DCMotor_GetSpeed();
SpeedLevel = DCMotor_Speed_PID(g_Speed, CurSpeed);
DCMotor_SetSpeed(MOTOR_1+MOTOR_2, SpeedLevel);
}
Temp = *P_UART_Command2;
if(Temp & M_RX_FLAG)
{
uiRS_Buff=*P_UART_Data;
if(uiRS_Buff)
uiRS_ReciveFlag=1;
else
uiRS_ReciveFlag=0;
}
if(uiRS_ReciveFlag)
{ uiRS_ReciveFlag=0;
if(uiRS_Buff>=20)
if(uiRS_Buff<=60)
g_Speed=uiRS_Buff;
else
g_Speed=60;
else
g_Speed=20;
}
KeyCode = Key_Get();
switch(KeyCode)
{
case KEY_1:
g_Speed += SPEED_STEP;
if(g_Speed > SPEED_MAX)g_Speed = SPEED_MIN;
break;
case KEY_2:
g_Speed -= SPEED_STEP;
if(g_Speed < SPEED_MIN)g_Speed = SPEED_MAX;
break;
case KEY_3:
DCMotor_Stop(MOTOR_1+MOTOR_2);
DIGclear();
return;
case KEY_4:
playspeed(g_Speed);
break;
default:
break;
}
}
}
void StartMotor1(void)
{
unsigned int KeyCode,g_Speed1=40;
unsigned int CurSpeed=0;
y1();
* P_TimerA_Ctrl=0x0032;
* P_TimerA_Data=0;
if(g_Direction==1)
DCMotor_Forward(MOTOR_1+MOTOR_2);
else
DCMotor_Backward(MOTOR_1+MOTOR_2);
DispNum(CurSpeed);
while(1)
{
if(DCMotor_IsSpeedRdy1())
{
DispNum(32768*10000/DCMotor_GetSpeed());
}
if(DCMotor_IsSpeedRdy())
{
DCMotor_SetSpeed(MOTOR_1+MOTOR_2, g_Speed1);
}
KeyCode = Key_Get();
switch(KeyCode)
{
case KEY_1:
g_Speed1 =40;
break;
case KEY_2:
g_Speed1 =21;
break;
case KEY_3:
g_Speed1 =18;
break;
case KEY_4:
g_Speed1 =14;
break;
case 0x0010:
y0();
DIGclear();
DCMotor_Stop(MOTOR_1+MOTOR_2);
g_Speed =40;
return;
default:
break;
}
}
}
int main(void)
{
unsigned int KeyCode, Flag_KeyEvent;
System_Init();
Flag_KeyEvent = 1;
while(1)
{
if(Flag_KeyEvent==1)
{
DispNum(g_Speed);
Flag_KeyEvent = 0;
}
KeyCode = Key_Get();
switch(KeyCode)
{
case KEY_1:
SetSpeed();
Flag_KeyEvent = 1;
break;
case KEY_2:
SetDirection();
Flag_KeyEvent = 1;
break;
case KEY_3:
StartMotor();
Flag_KeyEvent = 1;
break;
case KEY_4:
playspeed(g_Speed);
break;
case 0x0010:
StartMotor1();
Flag_KeyEvent = 1;
break;
default:
break;
}
}
}
void PlaySnd_Auto(unsigned int uiSndIndex)
{
SACM_A2000_Initial(1);
SACM_A2000_Play(uiSndIndex,3,3);
while((SACM_A2000_Status() & 0x0001) != 0)
{
SACM_A2000_ServiceLoop();
*P_Watchdog_Clear = 0x0001;
}
SACM_A2000_Stop();
}
void playspeed(unsigned int TempNum)
{
int iShow[4];
unsigned int KeyCode;
iShow[3]=TempNum/1000;
iShow[2]=(TempNum/100)%10;
iShow[1]=(TempNum/10)%10;
iShow[0]=TempNum%10;
KeyCode = Key_Get();
PlaySnd_Auto(12);
PlaySnd_Auto(iShow[1]);
PlaySnd_Auto(10);
if (iShow[0]!=0)
PlaySnd_Auto(iShow[0]);
PlaySnd_Auto(14);
*P_Watchdog_Clear = 0x0001;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -