📄 youyakokngzhi.c
字号:
/****************************************Copyright (c)**************************************************
**
**
**
**
**--------------File Info-------------------------------------------------------------------------------
** File name: cxjxkongzhi.c
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:
** Created date: 2009-03-04
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date: 2009-03-04
** Version: 1.0
** Descriptions: PHILIPS ARM7 微控制器 LPC2114
**
********************************************************************************************************/
#include "config.h"
#include <math.h>
//=======================================================================================================
#define QUEUEMAX 501 //定义通信队列数据最大个数为501
#define UART0_BPS 115200 /*定义UART0通讯波特率*/
//=========================================CPLD管脚定义===================================================
#define CPLD_CS 0x01000000 /*P1.24引脚连接片选信号/CS,低电平有效*/
#define CPLD_CLK 0x00000080 /*P0.7 引脚连接CPLD时钟信号*/
#define CPLD_DB0 0x00400000 /*P1.22引脚连接CPLD并口数据总线D0位*/
#define CPLD_DB1 0x00002000 /*P0.13引脚连接CPLD并口数据总线D1位*/
#define CPLD_DB2 0x00001000 /*P0.12引脚连接CPLD并口数据总线D2位*/
#define CPLD_DB3 0x00000800 /*P0.11引脚连接CPLD并口数据总线D3位*/
#define CPLD_DB4 0x00800000 /*P1.23引脚连接CPLD并口数据总线D4位*/
#define CPLD_DB5 0x00000400 /*P0.10引脚连接CPLD并口数据总线D5位*/
#define CPLD_DB6 0x00000200 /*P0.9引脚连接CPLD并口数据总线D6位*/
#define CPLD_DB7 0x00000100 /*P0.8引脚连接CPLD并口数据总线D7位*/
#define RDY 0x00800000 /*P0.23引脚连接电机驱动反馈*/
#define SN 0x00400000 /*P0.22引脚连接电机驱动方向控制*/
#define soft_rst 0x02000000 /*P1.25 */
#define PDDB0 IO1PIN&CPLD_DB0
#define PDDB1 IO0PIN&CPLD_DB1
#define PDDB2 IO0PIN&CPLD_DB2
#define PDDB3 IO0PIN&CPLD_DB3
#define PDDB4 IO1PIN&CPLD_DB4
#define PDDB5 IO0PIN&CPLD_DB5
#define PDDB6 IO0PIN&CPLD_DB6
#define PDDB7 IO0PIN&CPLD_DB7
#define soft_hight IO1SET=soft_rst
#define soft_low IO1CLR=soft_rst
#define cs_hight IO1SET=CPLD_CS
#define cs_low IO1CLR=CPLD_CS
#define clk_hight IO0SET=CPLD_CLK
#define clk_low IO0CLR=CPLD_CLK
#define MLCMS 0x1ffff /*18位分辨率满码*/
#define YYWS 6 /*取18位*/
#define ADVIN_FULL 23.4375 /*预先计算出理论的A/D满量程输入ADVIN_FULL=3/(64×2)= 23.4375mV*/
#define lzvout_max 15 /*传感器最大满量程15mv*/
#define syl_bzlc 10000 /*传感器满量程10000N*/
#define ybl_bzlc 1000 /*传感器满量程10000N*/
#define QCFH 0x1ffff /*去18位符号位*/
//=======================================================================================================
volatile uint8 uartrcv_cnt;
volatile uint8 uartrcv_new;
volatile uint32 cpld_data;
volatile uint8 cpld_int;
volatile uint8 data_cnt;
volatile uint8 pwm;
uint8 online;
uint8 yunxing;
uint8 fxkz;
uint8 jiajinchuli;
uint8 songchichuli;
uint32 yabianli;
uint32 shiyanli;
uint32 lzad_max;
uint32 tmp;
fp32 jiajinli;
fp32 songchili;
fp32 yunxingli;
fp32 lijiaozhun;
uint32 pwm_k;
fp64 ybl_sjz;
fp64 syl_sjz;
fp64 ybl_bc;
fp64 syl_bc;
fp64 newybl;
uint8 chuzhi_bz;
fp64 ybl_clr;
fp64 syl_clr;
fp64 rOut; // PID Response (Output)
typedef struct //队列类型定义
{
uint32 L1[QUEUEMAX]; //数据包
uint16 front; //队列头指针
uint16 rear; //队列尾指针
} SEQUEUE;
volatile SEQUEUE sq;
volatile uint8 uartrcv[14];
volatile uint8 cpld_dat[6];
typedef struct PID
{
fp32 SetPoint;
fp32 Proportion;
fp32 Integral;
fp32 Derivative;
fp32 LastError;
fp32 PrevError;
fp32 SumError;
} PID;
/********************************************************************************************************
*Function Name: delaymS(uint8 ms)
*Discription: 1ms延时子程序
*Data: 2008/06/18
*Author: SuLiangwei
********************************************************************************************************/
void delaymS(uint32 ms)
{
uint32 i,j;
for(j=0;j<ms;j++)
{
for(i=0;i<7300;i++) /*延时1mS*/
{;}
}
}
/********************************************************************************************************
*Function Name: delayuS(uint8 us)
*Discription: 1.5us延时子程序
*Data: 2009/03/04
*Author: SuLiangwei
********************************************************************************************************/
void delayuS(uint32 us)
{
while(us) {us--;}
}
/*******************************************************************************************************
* 名称:Time0Enable()
* 功能:使能定时器0,定时时间为10ms。
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void Time0Enable(void)
{
// /*Fcclk=Fosc*4=11.0592MHz*4=44.2368MHz */
// /*Fpclk=Fcclk/4=44.2368MHz/4=11.0592MHz*/
/*Fcclk=Fosc*5=11.0592MHz*4=55.2596MHz */
/*Fpclk=Fcclk/5=55.2596MHz/4=11.0592MHz*/
T0PR=0; /*设置定时器0分频为1分频,得11059200*/
T0MCR=0x03; /*匹配通道匹配中断并复位T0TC*/
// T0MR0=11059; /* 1000次/S比较值(10mS定时值)1ms*/
// T0MR0=110592; /* 100次/S 比较值(10mS定时值)10ms*/
T0MR0=110592*2; /* 50次/S 比较值(10mS定时值)20ms*/
// T0MR0=110592*4; /* 25次/S 比较值(10mS定时值)40ms*/
// T0MR0=11059200; /* 1次/S 比较值(10mS定时值)1000ms*/
// T0MR0=345600; /* 32次/S 比较值(10mS定时值)31.25ms*/
T0TCR=0x03; /*启动并复位T0TC*/
VICIntEnable = 0x00000010; /*使能TIME0中断*/
T0TCR=0x01;
}
/********************************************************************************************************
*Function Name: nop(void)
*Discription: 空函数,延时1us
*Data: 2009/03/04
*Author: SuLiangwei
********************************************************************************************************/
void nop(void)
{}
/*******************************************************************************************************
** 名称:UART0_Ini()
** 功能:初始化串口0
** 说明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz
** 通讯波特率115200,8位数据位,1位停止位,无奇偶校验
** 入口参数:无
** 出口参数:无
** 全局变量:无
** 调用函数:无
********************************************************************************************************/
void UART0_Ini(void)
{f
uint16 Fdiv;
U0LCR=0x80; /*DLAB=1,可设置波特率*/
Fdiv=(Fpclk/16)/UART0_BPS; /*设置波特率*/
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03; /*设置字符长度、停止位、奇偶校验*/
U0FCR=0x07; /*使能,初始化FIFO,并设置触发点为1字节*/
// U0IER=0x01; /*允许RBR中断,即接收中断*/
// U0LCR=0x2b; /*设置字符长度、停止位、偶校验*/
}
/*******************************************************************************************************
** 名称:IRQ_UART0()
** 功能:串口UART0接收中断
** 入口参数:无
** 出口参数:无
** 全局变量:无
** 调用函数:无
********************************************************************************************************/
void __irq IRQ_UART0(void)
{
uint8 IIR,t,verify;
while(((IIR = U0IIR) & 0x01) == 0) /*至少有一个中断被挂起*/
{
switch(IIR & 0x0e) /*根据中断标识处理:接收线状态、接收数据可用、字符超时、THRE中断*/
{
/*THRE中断*/
case 0x02:
break;
/*THRE中断处理结束*/
/*接收数据可用(RDA)中断*/
case 0x04:
uartrcv[uartrcv_cnt]=U0RBR; /*读取FIFO的数据,并清除中断标志*/
uartrcv_cnt++;
if( uartrcv[uartrcv_cnt-1]==0xfe) /*收到帧尾*/
{
verify=0;
for(t=0;t<(uartrcv_cnt-2);t++)
{
verify+= uartrcv[t];
}
if(verify== uartrcv[uartrcv_cnt-2]) /*校验和正确*/
{
uartrcv_new=0xff;
}
else /*校验和错误*/
{
uartrcv_new=0x88;
}
}
// uartrcv[10]=U0RBR;
// delayuS(5);
// U0THR=uartrcv[10];
// while((U0LSR&0x20)==0); /*等待数据发送完成*/
// uartrcv_new=0xff;
break;
/*接收数据可用(RDA)中断处理结束*/
/*接收线状态(RLS)中断*/
case 0x06:
break;
/*接收线状态(RLS)中断处理结束*/
/*字符超时(CTI)中断*/
case 0x0c:
break;
/*字符超时(CTI)中断处理结束*/
default:
break;
}
}
VICVectAddr=0x00; /*中断处理结束*/
}
/*******************************************************************************************************
* 名称:read_Byte(void)
* 功能:读取CPLD数据
* 入口参数:无
* 出口参数:
*******************************************************************************************************/
uint8 read_Byte(void)
{
uint8 tem_data=0x00;
if((PDDB0)!=0) {tem_data=(tem_data|0x01);}
if((PDDB1)!=0) {tem_data=(tem_data|0x02);}
if((PDDB2)!=0) {tem_data=(tem_data|0x04);}
if((PDDB3)!=0) {tem_data=(tem_data|0x08);}
if((PDDB4)!=0) {tem_data=(tem_data|0x10);}
if((PDDB5)!=0) {tem_data=(tem_data|0x20);}
if((PDDB6)!=0) {tem_data=(tem_data|0x40);}
if((PDDB7)!=0) {tem_data=(tem_data|0x80);}
return(tem_data);
}
/*******************************************************************************************************
* 名称:IRQ_Time0()
* 功能:定时器0中断服务程序
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
//void __irq IRQ_Time0(void)
//{
// datastr+= datastr;
// T0IR=0x01; /*清除定时器0中断标志*/
// VICVectAddr=0x00; /*通知VIC中断处理结束*/
//}
/********************************************************************************************************/
void __irq IRQ_Eint0(void)
{
uint8 kk;
uint32 ddtt;
uint32 ddtt2;
data_cnt++;
//--------------------------------------------------------------------------------
soft_low;
delayuS(2);
soft_hight;
//--------------------------------------------------------------------------------
cs_low; //CS
for(kk=0;kk<6;kk++) //Position(32bits)+State(8bits)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -