⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 由CCS3.1开发
💻 C
字号:
/**
Title:	 main_C
Author:	DAI(戴红军)
Date:		2008.04.8
步进电机控制程序,for YAO
*/


#include "LF2407REGS.h"
#include "SysFun.h"
#include "lcm.h"
//#include <stdio.h>
//#include <stdlib.h>
#include "IoDef.h"


Uint	CurrentState;
/*================================================
//当前状态
#define CONFIG	1	//KeyRunPause=0,PAUSE	
#define AUTO		2	//KeyRunPause=1, KeyAutoMan=1;
#define MANUAL	3	//KeyRunPause=1, KeyAutoMan=0;
#define nMaxState	3
================================================*/
Uint	CLOCKWISE=0;
Uint Motor=0;
Uint ENA=0;
Uint ENAold=0;
Uint DIR=0;
Uint nPWMPER=0;
Uint nFree=1;
extern unsigned int nIntervalTime;//保存当前间隔时间;
extern unsigned int nKeyAutoMan;//自动、手动
extern unsigned int nKeyRunPause;//启动、停止调整参数
extern unsigned int nKeyIncrease;//增加
extern unsigned int nKeyDecrease;//减少
extern unsigned int nKeyStop;		//急停

extern float fADAdjust;	//旋钮参数,归一到0-30V
extern float fADCInVoltage;	//反馈电压,归一到0-30V
extern float fSetVelocity;
extern Uint flagKeyDelay;

//	Display(STR2,0x82); // 上面一行显示一个预定字符串
//第一行显示当前状态
Uchar StrState[]="状态    ";
Uchar StrStateConfig[]="参数调节";
Uchar StrStateRun[]="自动运行";
Uchar StrStateMan[]="手动运行";
//第二行显示当前速度或者参数、方向
Uchar StrVelocity[] = "速度 ";
Uchar StrSetVelocity[] = "预设速度    ";
Uchar StrDir[]="方向  ";
Uchar StrLeft[]="左";
Uchar StrRight[]="右";
Uchar StrStop[]="停";
Uchar StrFree[]="空";
//第三行显示预设电压
Uchar StrSetVoltage[] = "预设电压";
//第四行显示反馈电压
Uchar StrFeedbackVoltage[] = "反馈电压";
Uchar StrScreen[64];
char StrFloatVelocity[8]; 		//**.*
char StrFloatFeedbackVoltage[8];
char StrFloatSetVoltage[8];

char Str[8];
//仅仅保留小数点后1位
void floatToString(float f, char * ch)
{
	int n,deci,ones;
	n= (int)f;
	n=n%100;
	deci=(n/10);
	if(deci==0)
		*ch=(0x20);
	else
		*ch=(n/10+0x30);
	ch++;
	*(ch++)=(n%10+0x30);
	*(ch++)='.';
	*(ch++)=((int)((f-(int)f)*10)+0x30);
	*(ch++)='\0';	//end
}
/*
ascII code 
a 	61
z	7A
A	41
Z	5A
0	30
=========================================*/
main()
{
//	char char1='1';
//	floatToString(123.456,(char*)Str);
	/*====================================================================================
	/*     功能模块初始化
	/*====================================================================================*/
	SysInitial();
//	DelayMs(10);
	KeyInitial();
	MotorInitial();
	Timer2Initial();
	AdcInitial();
	LcmInitial();

	/*====================================================================================
	/*     参数初始化
	/*====================================================================================*/
	CurrentState=1;
	fSetVelocity=5.0;	//预设的速度

	/*====================================================================================
	/*     启动部分功能
	/*====================================================================================*/
	asm("	clrc	INTM");	
	START_ADC;
	START_TIM;
//	START_PWM;
//	delayDecis(20);

	/*====================================================================================
		显示欢迎信息,同时测试显示屏
	/*====================================================================================*/
	
	while(1)
	{
		char *str;
		/*====================================================================================
		/*    判断当前状态
		//当前状态
		#define CONFIG	1	KeyRunPause=0,PAUSE	
		#define AUTO		2	KeyRunPause=1, KeyAutoMan=1;
		#define MANUAL	3	KeyRunPause=1, KeyAutoMan=0;
		/*====================================================================================*/
		if(nKeyRunPause==0)
			CurrentState=CONFIG;
		else if(nKeyRunPause==1&&nKeyAutoMan==1)
			CurrentState=AUTO;
		else if(nKeyRunPause==1&&nKeyAutoMan==0)
			CurrentState=MANUAL;
		//多余状态转移
		if((CurrentState>nMaxState)||(CurrentState==0))
			{
			CurrentState=1;
			}
		/*====================================================================================
		进入各个状态的工作
		/*====================================================================================*/

		/*====================================================================================
		参数调整
		/*====================================================================================*/

		if(CurrentState == CONFIG)
			{
			
			ENA=0;

			if(nKeyIncrease&&(flagKeyDelay==0))
				{
				fSetVelocity+=0.1;
				if(fSetVelocity>10)
					fSetVelocity=10.0;
				flagKeyDelay=1;
				}
			if(KeyDecrease&&(flagKeyDelay==0))
				{
				fSetVelocity-=0.1;
					if(fSetVelocity<0)
						fSetVelocity=0.0;
					flagKeyDelay=1;
				}

//			LcmClear();
			DelayMs(10);
//			LcmInitial();
			
			Display(StrState, 0x80);
			Display(StrStateConfig, 0x84);	//1行80-87h
			Display(StrSetVelocity,0x90);	//	2行90-97h
			Display(StrSetVoltage,0x88);//	3行 88-8F
			Display(StrFeedbackVoltage,0x98);//4行98-9f

//			sprintf(StrFloatVelocity, "%8.1f",fSetVelocity);
			floatToString(fSetVelocity, Str);
			Display((Uchar*)Str , 0x96);	// 2 	//hang
//			sprintf(StrFloatSetVoltage, "%8.1f",fADAdjust);			
			floatToString(fADAdjust,Str);			
			Display((Uchar*)Str,0x8E);	// 3 //hang
			
//			sprintf(StrFloatFeedbackVoltage, "%8.1f",fADCInVoltage);
			floatToString(fADCInVoltage,Str);
			Display((Uchar*)Str,0x9E);	//4hang
			}

		/*====================================================================================
		自动运行
		/*====================================================================================*/
		if(CurrentState == AUTO)
		{


			//自动运行
			ENA=1;
			if(fADAdjust>fADCInVoltage)//电压低,电机向上移动;
				DIR=0;
			else
				DIR=1;


//			LcmClear();
			DelayMs(10);
//			LcmInitial();
			Display(StrState, 0x80);
			Display(StrStateRun, 0x84);	//1行80-87h
			Display(StrVelocity,0x90);	//	2行90-97h
			Display(StrDir,0x94);	//	2行90-97h
			Display(StrSetVoltage,0x88);//	3行 88-8F
			Display(StrFeedbackVoltage,0x98);//4行98-9f

//			sprintf(StrFloatVelocity, "%4.1f",fSetVelocity);	//显示速度
			floatToString(fSetVelocity, StrFloatVelocity);
			Display((Uchar*)StrFloatVelocity,0x92);
//			sprintf(StrFloatSetVoltage, "%8.1f",fADAdjust);
			floatToString(fADAdjust, StrFloatSetVoltage);
			Display((Uchar*)StrFloatSetVoltage,0x8E);
//			sprintf(StrFloatFeedbackVoltage, "%8.1f",fADCInVoltage);
			floatToString(fADCInVoltage, StrFloatFeedbackVoltage);
			Display((Uchar*)StrFloatFeedbackVoltage,0x9E);
			//方向
			if(CLOCKWISE==0)
			{
				if(DIR==0)
					Display((Uchar*)StrLeft, 0x97);
				if(DIR==1)
					Display((Uchar*)StrRight, 0x97);
			}
			else if(CLOCKWISE==1)
			{	if(DIR==0)
					Display((Uchar*)StrRight, 0x97);
				if(DIR==1)
					Display((Uchar*)StrLeft, 0x97);
			}

		}
		
		/*====================================================================================
		手动运行
		/*====================================================================================*/
		if(CurrentState == MANUAL)
			{
			
			if(nKeyIncrease||nKeyDecrease)
				{
				ENA=1;
				}
			else
				ENA=0;

			if(nKeyIncrease==1)
				{
				if(CLOCKWISE==0)
					DIR=0;
				else
					DIR=1;
				}
			if(nKeyDecrease==1)
				{
				if(CLOCKWISE==0)
					DIR=1;
				else
					DIR=0;
				}

			nFree=nKeyStop;

//			LcmClear();
			DelayMs(10);
//			LcmInitial();			
			Display(StrState, 0x80);
			Display(StrStateMan, 0x84);	//1行80-87h
			Display(StrVelocity,0x90);	//	2行90-97h
			Display(StrDir,0x94);	//	2行90-97h
			Display(StrSetVoltage,0x88);//	3行 88-8F
			Display(StrFeedbackVoltage,0x98);//4行98-9f

//			sprintf(StrFloatVelocity, "%4.1f",fSetVelocity);	//显示速度
			floatToString(fSetVelocity, StrFloatVelocity);
			Display((Uchar*)StrFloatVelocity,0x92);
			//方向
			if(ENA==1)
				{
				if(DIR==0)
					Display((Uchar*)StrLeft, 0x97);
				if(DIR==1)
					Display((Uchar*)StrRight, 0x97);
				}
			else if(nFree==1)
				{
				Display((Uchar*)StrStop, 0x97);
				}
			else
				{
				Display((Uchar*)StrFree, 0x97);
				}
	
//			sprintf(StrFloatSetVoltage, "%8.1f",fADAdjust);
			floatToString(fADAdjust, StrFloatSetVoltage);
			Display((Uchar*)StrFloatSetVoltage,0x8E);
//			sprintf(StrFloatFeedbackVoltage, "%8.1f",fADCInVoltage);
			floatToString(fADCInVoltage, StrFloatFeedbackVoltage);
			Display((Uchar*)StrFloatFeedbackVoltage,0x9E);
			}
/*		//根据与设定给出PWM波的频率
		ENA=0;
		DIR=0;
			ENA1=ENA;
			DIR1=DIR;
			ENA2=ENA;
			DIR2=DIR;
		ENA=1;
		DIR=1;
			ENA1=ENA;
			DIR1=DIR;
			ENA2=ENA;
			DIR2=DIR;
*/
/*=================================================
3脚 PWM1作为方向,2脚 DIR1输出PWM, 4脚ENA2 作为运转时能,连接FREE引脚
==================================================*/
				
				//PWM10/IOPE4 CMPR5	2	7407:11->10

		PWM1=DIR;	//IOPA6/		3	7407:5->6
		ENA2=nFree;	//IOPE7/		4	7407:3->4

			nPWMPER = (Uint)(10*0x666/(fSetVelocity));	//10对应400HZ
			 *T3PER = nPWMPER;
			*CMPR5= (nPWMPER/2);	//IOPE4/PEM10

			if(ENA!=ENAold)
			{
				if(ENA)
 					{STARTT3_PWM;}
				else{STOPT3_PWM;}
				ENAold=ENA;
			}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -