AVR单片机的全功能工业控制器设计
2013-11-12 来源:eefocus
引言
在自动控制产品的设计过程中,实现方案的选择常常是很矛盾的。使用可编程逻辑控制器(PLC)和人机界面(HMI)来实现,开发速度较快,但成本太高,所开发的产品没有市场竞争力;使用单片机开发,成本低但开发周期长、开发量大且通用性不好。用户需要的是一种成本低、开发周期较短、通用性较好的控制器,因此全功能工业控制器有很大的应用市场。
全功能工业控制器的整个电路分为信号隔离输入部分、控制器输出部分、实时时钟与历史数据存储部分、彩色液晶显示和触摸屏控制部分、通信接口等。
1 信号隔离输入电路
信号隔离输入电路分为开关量隔离输入、模拟量隔离输入、高速电脉冲隔离输入,电路如图1所示,开关量的隔离输入较为简单,输入信号采用光耦进行隔离后送入单片的普通I/O,单片机用查询方式进行采集。
图1 信号隔离输入电路
高速电脉冲的采集需要注意的是,所设计的电路必须适应高速信号采集的要求,因此隔离光耦应采用高速光耦(如6N137等)。采用查询方式采集高速脉冲容易造成采集数据的丢失,高速脉冲应采用中断方式进行采集。
模拟量隔离采集是本控制器的一个重点和难点,笔者之前采用了线性光耦等多种方式进行模拟量的隔离采集实验,均未获满意的效果。这里采用一种先将模拟量数字化(使用AD7705),然后通过有光耦隔离的数据口送到CPU进行模拟量隔离采集的方式,效果理想。
2 控制器输出电路
控制器的输出方式有继电器输出、晶体管输出、模拟电压输出,如图2所示。继电器输出和晶体管输出电路较为简单,这里不作详细的介绍。下面着重介绍模拟电压的产生原理。
图2 控制器输出电路
模拟电压的输出主要利用ATmega128的PWM端口来实现,PWM输出脉冲经光耦隔离后再进行滤波产生所需的直流信号。为了提高驱动能力,加了一级射极跟随器,如图2上半部所示。
PWM电压调节实现的程序如下:
#define PWM1_IN(){DDRB.5=1;PORTB.5=0;}//PWM端口控制
#define PWM1_OUT() DDRB.5=1;
/**********************
PWM初始化程序:
使用TIMER1,预分频为8,设置10位快速PWM模式,关闭中断
**********************/
void pwm_init(void){
TIMSK&=0xC3; //关闭TIMER1中断
ETIMSK&=0xFE;
TCCR1A=0; //关闭定时器
TCCR1B=0;
OCR1A=0x0000; //关闭输出
OCR1B=0x0000;
TCCR1A=0xA3; //设置10位快速PWM
//模式,预分频为8
TCCR1B=0x0A;
PWM1_IN()
}
/***************************
PWM通道控制程序: 功能——可以进行单通道的开关和调整输出
入口参数—— b为通道控制(1—改值,2—开端口,3—关端口);
c为PWM更改值
***************************/
void pwm(unsigned char b,unsigned int c){
switch(b){
case 1://改变PWM1值
if(c<=0x03FF)OCR1A=c;
break;
case 2://开PWM1端口
if(c<=0x03FF)OCR1A=c;
PWM1_OUT()
break;
case 3://关PWM1端口
OCR1A=0x0000;
PWM1_IN()
break;
}
}
3 实时时钟和历史数据存储模块
很多工业控制器需要将关机前的有关数据记录下来,以便下次开机时继续使用原先设置好的参数;有些工作数据也要进行实时保存,以保证不因掉电等意外发生而受影响。采用EEPROM存储,读写速度慢而且受使用次数的限制;采用铁电存储器可以实现,但一般容量小,价格较高。
工业控制操作往往是与当前实时时钟相关联的,实时时钟在工业控制器中是很重要的一个部件。
美国Dallas公司的DS1642,将实时时钟和历史数据存储器合二为一,价格也较为适中。电路的连接方式如图3所示。
DS1642包含1个2K×8的非易挥发性的SRAM和1个实时时钟/日历,以及内嵌晶振和锂电池。 DS1642的时钟寄存器和记忆寄存器的存取方式同普通RAM的存取方式,而计时寄存器采取了双缓冲的方式,以保证在存储器存取过程中不间断计时。当电能监控电路监测到掉电时,DS1642即接通内部电源以确保时间保持和内存数据不受破坏,精度可达1 min/月。详情请见有关数据手册。
4 彩色液晶显示模块
彩色液晶显示功能的实现直接采用深圳市中天越华自动控制科技有限公司的ZTCOLOR3彩色液晶驱动模块,电路接口如图3所示。
模块的使用很简单,模块本身具有数据刷新等功能。当显示的画面没有变化时,单片机不需要对模块进行操作;要更改显示界面时,用写寄存器的方式写入数据即可。(详见生产商的使用说明书)
图3 时钟和数据存储与液晶显示模块连接电路、
5 触摸屏控制模块
触摸屏采用四线电阻式触摸屏,利用ATmega128的A/D口对通电后的触摸屏各触摸点电压值进行采样,以确定用户的触摸位置而进行相应的操作。电路如图4所示。
图4 触模屏控制模块电路
具体实现程序如下:
#define TX1_0(){PORTE.3=1;DDRE.3=1;}
#define TY1_1(){PORTE.5=0;DDRE.5=1;}
#define TY1_0(){PORTE.5=1;DDRE.5=1;}
#define TX0_1(){PORTE.4=1;DDRE.4=1;}
#define TX0_0(){PORTE.4=0;DDRE.4=1;}
#define TY0_1(){PORTE.6=1;DDRE.6=1;}
#define TY0_0(){PORTE.6=0;DDRE.6=1;}
#define TINT_IN() {DDRE.7=0;}//触摸屏中断口为输入方式
#define TINT_INPUT PINE.7
#define TADX_IN(){DDRF|=1;PORTF&=0xFE;delay_us(50);DDRF&=0xFE;}//触摸屏ADC端口为输入方式#define TADY_IN(){DDRF|=2;PORTF&=0xFD;delay_us(50);DDRF&=0xFD;}
/******************************
触摸屏初始化: 初始化触摸屏四线端口、初始化触摸屏中断口、初始化ADC端口
******************************/
void touch_init(void){
unsigned char i;
TX1_0() //初始化四线端口
TX0_0()
TY1_1()
TY0_0()
TINT_IN() //触摸屏中断端口为输入方式
EICRB|=0xC0; //设置INT7为上升沿触发,清除中断
//标志,开中断
EIFR|=0x80;
EIMSK|=0x80;
TADX_IN()//把触摸屏ADC端口设置为输入
TADY_IN()
}
/*************************************
INT0中断程序(触摸屏数据采集程序)
采用中断方式,在中断程序中进行A/D转换读取触摸屏数据
*************************************/
interrupt[9] int7_touch(void){ //触摸屏数据采集程序
touch_int();
TADY_IN()
TADX_IN()
TX1_0()//启动ADC转换Y轴数据
TX0_0()
TY0_1()
TY1_1()
delay_us(400);
for(i=0;i<15;i++){
ADCSRA=0xA3;
ADMUX=0x41;
ADCSRA|=0x40;
while(!ADCSRA.4){;}
touch_ydata[i]=ADC&0x03FF;
}
TY1_0() //启动ADC转换X轴数据
TY0_0()
TX1_1();
TX0_1()
delay_us(400);
for(i=0;i<15;i++){
ADCSRA=0xA3;
ADMUX=0x40;
ADCSRA|=0x40;
while(!ADCSRA.4){;}
touch_xdata[i]=ADC&0x03FF;
}
EIMSK&=0x7F;
//一次数据接收完成,关闭中断
TX1_0()
TX0_0()
TY1_1()
TY0_0()
TINT_IN()
TADX_IN()
TADY_IN()
EIFR|=0x80;
//清除中断标志位
TADY_IN()
TADX_IN()
}
6 通信接口
控制器通信接口是具有抗噪声干扰性、长距离传输和多站连接能力的RS485接口。它是采用单片机串口通过光耦隔离后,再经过Maxim公司RS485芯片来实现的,主要用于组网和方便与上位计算机的通信。具体电路见图4。
结语
本文介绍的全功能工业控制器,具有较高的通用性,已用于批量生产。有关电路和程序均已验证,可以直接引用。