打印
[Atmel]

【秀出我的Atmel设计方案】+ 基于ATmega128L的电机励磁控制系统

[复制链接]
2650|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 mikeliujia 于 2014-12-2 20:55 编辑

硬件设计环境:protel 99SE
软件设计环境:ICCAVR
第一次入门单片机是AtmelAT89S51,后来逐渐接触到AVRATmega16/128慢慢做过些小玩意,不过这个才是第一个真正意义上的产品!
整个励磁控制台主要是在所建立数学模型的基础上结合ATmega128L具有高速、低功耗、流水线结构的特点,内部集成高速AD采样端口和PWM输出端口,设计的一款数字式轮胎起重机励磁控制系统。这在很大程度上简化了励磁控制系统的硬件结构,提高了励磁控制系统的可靠性和抗干扰能力。
框图如下

框图中各主要部分功能简述如下:
1ATmega128:是控制单元的核心,主要实现按软件程序产生占空比可调的PWM波,读取采样信号,控制输出信号,实时监测并发出报警信号等功能。
2IPM:智能功率模块的缩写,是驱动单元的核心,不仅内部集成过热、过流、过压等故障检测电路,还把驱动电路和功率开关器件集成在一起,主要用来控制驱动串励直流电动机电枢电压的通断。
3)光耦:本励磁控制系统涉及多级别的工作电压和驱动电压,因此使用光耦实现电气隔离,使信号单向传输,输出信号对输入端无影响。另外使用线性光耦反馈电路,用调节控制端电流的方式来改变占空比,实现精密稳压。
4)电流检测:将串励直流电动机的电枢电流经过霍尔电流传感器的检测,送入ATmega128AD采样端口,经AD转换作为故障检测和过流判断的依据。
5)速度检测:将光栅测速传感器产生的脉冲送入ATmega128端口,通过中断端口计数的脉冲计算串励直流电动机的转速。

给出部分硬件电路
124V5V直流电源电路:控制单元属于弱电部分,这里的电源主要是给ATmega128L及其外围电路供电。考虑到轮胎起重机上有一个通过柴油机发电的直流电源电瓶,电源电压为24V,可以采用DC-DC转换模块,满足不同级别的直流电供电需求。这里ATmega128L理想的供电电压是5V,因此,采用24V5VDC-DC电源转换模块。图中DC1DC-DC电源模块YND5-24S05YND是系列号,输出功率5W,输入电压是24V,输出模式单路(S),输出电压是5V1脚连接+24V直流电瓶电源的地,2脚接+24V电瓶电源的正极,3脚输出+5V的直流电压,4脚是+5V的地。24V电压由最左边节点输入。在电源模块的输入端和输出端都加上了∏型滤波电路和LC滤波电路,主要作用是滤除不需要的谐波和纹波,在直流电源电路中减小电流的脉动,使直流电流更平滑。


2、驱动部分的电源主要是针对IPM智能功率模块设计。这里选用富士电机的6MBP15RH060型号IPM,内置6单元IGBT,额定电流15A,耐压值600V。根据其Datasheet,上桥臂控制电源使用三组,下桥臂和制动单元共用一组,这四组控制电源须互相绝缘,与主电源之间距离大于2mm。正常驱动电压是13.516.5V,推荐值为15V。因此,选用24V15V的电源模块,如图所示。

图中U11U14均是DC-DC电源模块YND5-24S15YND是系列号,输出功率5W,输入电压是24V,输出模式单路(S),输出电压是15VU11支路是驱动轮胎起重机的起升机构部分,U12支路是驱动轮胎起重机的变幅机构部分,U13支路作为备用,U14用作制动单元和部分光耦供电。其引脚的连接关系都相同,1脚连接+24V直流电瓶电源的地,2脚接+24V电瓶电源的正极,3脚输出+15V的直流电压,4脚是+15V的地。各电源模块的输入端和输出端也都加上了∏型滤波电路和LC滤波电路,主要作用也是去除不需要的谐波和纹波,在直流电源电路中减小电流的脉动,使直流电流更平滑。

3ATmega128L最小系统的搭建:复位电路+时钟电路+AD转换滤波电路+ISP下载电路+串口通信电路


4、电流检测电路
将串励直流电动机的电枢电流经霍尔电流传感器检测,输出电压信号送入ATmega128AD采样端口,经AD转换作为故障检测、过流依据,如图所示
ATmega128L的ADC采样的基准电压是2.56V,因此电流传感器的输出电压应在2.56V以下。LTS25-NP是一款应用霍尔原理的闭环多极电流传感器,具有良好的线性度、出色的精度、反应时间快、低温漂、抗干扰能力强等特点。其电流测量范围±80A,输出最大电压2.5±0.625V,在其电源端采用了∏型滤波和RC-∏型滤波,前者高频滤波,后者既起滤波作用又起阻抗变换的作用,R73既将残余的纹波电压降落在电阻两端,又可以将ADC输入电压稳定在0~2.56V。图中1、4脚接输入电流回路,8、9脚接+5V直流工作电源,供模块工作,7脚为电压输出口。

5、PWM波输入采集电路+半桥控制驱动电路

励磁控制系统的功率驱动电路主要由PWM波的输入采集电路和H桥控制电路组成,通过PWM波和IPM内集成的H桥共同作用驱动串励直流电动机工作。因为信号传输延迟时间在IPM驱动电路中应在0.5us内,所以PWM波的传输只能采用快速光耦。为了提高信号传输速度,采用高速光电耦合器TLP559,该器件速度快、隔离电压高、高电平输出传输延迟时间最大为0.3us,低电平输出传输延迟时间最大为0.5us。如上图即是IPM对PWM波的输入采集电路。
在P3~P6的各端口中,1、2、3端子串联,PWM波和通道开关信号经组合逻辑门电路送入2端子。如果1端子处为高电平,光耦导通,输出高电平,如为低电平,光耦不导通,输出低电平。将PWM波送入IPM,通过改变PWM波的占空比控制IGBT构成的半桥电路的通断来调节励磁电流的值,从而对串励直流电动机进行调速;通过通道开关信号选择半桥SCR1或者SCR2上下桥臂的导通,实现对串励直流电动机的转向控制。如下分别是半桥控制电动机正反转原理图。

半桥电路由2个续流二极管和2个IGBT组成,正负电源供电,其形状像半个“H”字,因此称半桥式电路。2个IGBT做开关管分成两组,Q13为一组,Q15为另一组,上下组的开关管的导通与关断正好相反。当Q13导通时,电动机就正转;当Q15导通时,电动机就反转。上下的开关管不能同时导通,否则电源会短路,为此,IPM内部增加了容错保护电路,当同位的电路接通,电动机就会产生电制动。

6、过流保护电路+制动电路
由于串励直流电动机在起动和过载时易出现过流现象,因此励磁控制系统中必须有过流保护电路。如图所示,即是过流保护电路。电流检测电路将反馈的电枢电流转换成反馈电压信号送入ATmega128L的ADC端口,内部程序分析到反馈电压过大时,启动过流保护程序,ATmega28L会将REL_P1端口置低电平,信号经与非门U20C后变成高电平,光耦U17导通,三极管Q5导通,继电器闭合,IPM主电源切断,则串励直流电动机进入“自锁”状态。同时,发光二极管LED16发光,蜂鸣器LS1鸣响,报警提示。图中,D6是IN4148续流二极管,防止继电器电流消失时产生的感应电动势击穿三极管。


当电流过载需使电动机进入“自锁”状态或需要对电动机制动时,ATmega128L内部程序开制动器,如图即是制动电路。

ATmega128L发出制动信号时,置高RELAY1端口电平,光耦U15导通,三极管Q1导通,继电器闭合,PLC制动器激活,控制同轴电动机电磁阀抱闸,串励直流电动机能耗制动。同时,发光二极管LED3发光,提示制动。图中,D1也是IN4148续流二极管,作用同过流保护电路中的D6。


其他的硬件电路就不详述了,下面给出软件流程图


下面是实物图









相关帖子

沙发
mikeliujia|  楼主 | 2014-12-2 20:55 | 只看该作者
ADC.c
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

//常量定义
//单端通道,不放大
#define AD_SE_ADC0                         0x00                //ADC0
#define AD_SE_ADC1                         0x01                //ADC1
#define AD_SE_ADC2                         0x02                //ADC2
#define AD_SE_ADC3                         0x03                //ADC3
#define AD_SE_ADC4                         0x04                //ADC4
#define AD_SE_ADC5                         0x05                //ADC5
#define AD_SE_ADC6                         0x06                //ADC6
#define AD_SE_ADC7                         0x07                //ADC7

unsigned int read_adc(unsigned char adc_input)//查询方式读取ADC单端通道
{   
    unsigned int adc_low,adc_high;
       
    ADMUX=(0x40|adc_input);                                        //adc_input:单端通道 0x00~0x07,0x1E,0x1F
    //0x40:AVCC   0xc0:选择内部2.56V参考电压
    ADCSRA|=(1<<ADSC);                                                //启动AD转换
    loop_until_bit_is_set(ADCSRA,ADIF);                //方法1 等待AD转换结束
    ADCSRA|=(1<<ADIF);                                                //写1清除标志位
        adc_low=ADCL;         //朝:必须先读adhl,在读adch,否则读出的总是第一次转换值
        adc_high=ADCH;
    return(adc_low|(adc_high<<8));        //ADC=ADCH:ADCL
}

/*
SIGNAL(SIG_ADC) //ADC中断服务程序
{
    //硬件自动清除ADIF标志位
    ADC_INT_SE=ADC;                                                //读取结果
    ADC_OK=1;
}

   
    ADCSRA|=(1<<ADIE);                                //使能ADC中断
    ADMUX=0xC0|AD_SE_ADC0;                        //单端输入ADC0
    ADC_OK=0;                                                //软件标志清零
    ADCSRA|=(1<<ADSC);                                //启动AD转换
    while(ADC_OK==0);                                //等待ADC完成,实际程序中可以运行其它任务
    ADCSRA&=~(1<<ADIE);                         //禁止ADC中断
    //查询方式和中断方式要注意 ADIF标志位的处理。
   
*/


使用特权

评论回复
板凳
mikeliujia|  楼主 | 2014-12-2 20:55 | 只看该作者
USART.c
//注意: atemga128有两个串口USART00,USART01
//USART00 PE0,PE1
//USART01 PD2,PD3
//注意: atmega128串口中断接受,UDR0,UDR1

#include <avr/io.h>
#include <avr/interrupt.h>  //sei();cli();

#define RXD0 PE0   
#define TXD0 PE1

void Delay1s(void);

void USART0_Init(void);
void USART0_SendOneChar(unsigned char dat);
void USART0_SendStringChar( unsigned char *charstring,unsigned char length);
/*************************************************************************************************/

void USART0_Init(void)
{
  DDRE|=(1<<TXD0);
  DDRE&=~(1<<RXD0);
  UCSR0B|=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//允许接受,允许发送,开接受中断  
  UCSR0C|=(1<<UCSZ01)|(1<<UCSZ00);//8位数据,1位停止位
  UBRR0L=12; //baund 8m 51-9600  12-384000   7,3728m 11-384000
  UBRR0H=0;
  sei();  //开总中断
}


void USART0_SendOneChar(unsigned char dat)
{
   while(!(UCSR0A & (1<<UDRE)));
        outb(UDR0, dat);

}

void USART0_SendStringChar( unsigned char *charstring,unsigned char length)
{
  unsigned char i;
  for(i=0;i<length;i++)
    USART0_SendOneChar(charstring[i]);
}

void Delay1s(void)
{ unsigned int i,j;
  for(j=0;j<2000;j++)
   for(i=0;i<1825;i++);
}



使用特权

评论回复
地板
mikeliujia|  楼主 | 2014-12-2 20:55 | 只看该作者
main.c就不给啦

使用特权

评论回复
5
mikeliujia|  楼主 | 2014-12-2 20:55 | 只看该作者
选择ATmel的AVR系列-ATmega128,主要原因是抗干扰能力强,其实之前也试过其他的片子,测试结果都没有ATmega128的理想。

使用特权

评论回复
6
ddllxxrr| | 2014-12-2 20:55 | 只看该作者
比较全啊,顶个

使用特权

评论回复
7
songchenping| | 2014-12-2 20:55 | 只看该作者
用的电源是益弘泰的啊!

使用特权

评论回复
8
mikeliujia|  楼主 | 2014-12-2 20:55 | 只看该作者
songchenping 发表于 2014-12-3 09:54
用的电源是益弘泰的啊!

You get it!:lol

使用特权

评论回复
9
songchenping| | 2014-12-2 20:55 | 只看该作者
mikeliujia 发表于 2014-12-3 12:50
You get it!

非常眼熟啊。

使用特权

评论回复
10
wxjcan| | 2014-12-2 20:55 | 只看该作者
学习下

使用特权

评论回复
11
zhangchaoying| | 2014-12-2 20:55 | 只看该作者
我还以为大家都奔ARM cotex了呢!赞一个!

使用特权

评论回复
12
mikeliujia|  楼主 | 2014-12-2 20:55 | 只看该作者
zhangchaoying 发表于 2014-12-3 21:27
我还以为大家都奔ARM cotex了呢!赞一个!

8位机其实还有很大的市场

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:纸上得来终觉浅,绝知此事要躬行

10

主题

365

帖子

2

粉丝