Автор: Пользователь скрыл имя, 09 Декабря 2011 в 13:18, реферат
Цели работы:
Провести обзор по законам регулирования.
Освоить язык С и основы программирования микроконтроллера.
Освоить методику вычисления коэффициентов для закона ПИД- регулирования.
Написать программу для микроконтроллера Atmega16, контролирующую процесс термостабилизации.
Г л а в а I
Введение………………………………………………………………………………3
Глава I. ЛИТЕРАТУРНЫЙ ОБЗОР………………………………..……………..5
ЗАКОНЫ РЕГУЛИРОВАНИЯ.……………………………………………………..…5
П- РЕГУЛЯТОРЫ……………………………………………………………………6
ПИ- РЕГУЛЯТОРЫ………………………………………………………………….7
ПИД- РЕГУЛЯТОРЫ………………………………………………………………...7
ИНТЕРФЕЙС I2C(TWI)……………………………………………………………….9
ФОРМАТ ПОСЫЛКИ ПЕРЕДАВАЕМЫХ ДАННЫХ………………………………..10
Условия СТАРТа и СТОПа……………………………………………………….10
Формат адресного пакета………………………………………………………...10
Формат пакета данных…………………………………………………………...11
ФОРМИРОВАНИЕ ШИМ СИГНАЛА……………………………………………….11
РЕЖИМ БЫСТРОЙ ШИМ……………………………………………………...…..12
Г л а в а I I.ПРОГРАМНОЕ ОБЕСПЕЧЕНИЕ………………………………...14
АЛГОРИТМЫ ЦИФРОВОГО ПИД РЕГУЛИРОВАНИЯ……………………………14
СИСТЕМА АВТОМАТИЧЕСКОГО РЕГУЛИРОВАНИЯ……………………………14
ПРОГРАМНОЕ ОБЕСПЕЧЕНИЕ……………………………………………………15
ОСНОВНЫЕ РЕГИСТРЫ МИКРОКОНТРОЛЛЕРА………………………………...15
ОПИСАНИЕ РЕГИСТРОВ TWI……………………………………………………..16
ОПИСАНИЕ РЕГИСТРОВ 8-РАЗРЯДНОГО ТАЙМЕРА- СЧЕТЧИКА 0……………...17
ЗАКЛЮЧЕНИЕ…………………………………………………………………….22
ПРИЛОЖЕНИЯ……………………………………………………………………23
СПИСОК ЛИТЕРАТУРЫ…………………………………
Разряд 2 - Резервный бит
Данный бит является резервным и считывается как 0.
Разряды 1..0 - TWPS: Биты предделителя TWI
Данные
биты отличаются полным доступом (чтение/запись)
и позволяют управлять
Регистр данных шины TWI - TWDR
Разряд | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TWD7 | TWD6 | TWD5 | TWD4 | TWD3 | TWD2 | TWD1 | TWD0 | |
Исх. значение | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
В режиме передатчика регистр TWDR содержит следующий байт для передачи. В режиме приемника регистр TWDR содержит последний принятый байт. Запись в регистр возможна только когда TWI не выполняет процесс сдвига данных. Такое состояние наступает, когда происходит аппаратная установка флага прерывания TWINT. Обратите внимание, что регистр данных не может инициализироваться пользователем перед возникновением первого прерывания. Данные в регистре TWDR остаются стабильными пока установлен бит TWINT. Во время сдвига последовательной передачи данных одновременно происходит сдвиг для последовательного ввода. TWDR всегда содержит последний байт представленный на шине, исключая ситуацию возобновления нормальной работы микроконтроллера по прерыванию TWI. В этом случае состояние TWDR является неопределенным. В случае потери арбитрирования шины данные, передаваемые от ведущего к подчиненному, не теряются. Управление битом ПОДТВ происходит автоматически под управлением схемы TWI, а ЦПУ непосредственного доступа к биту ПОДТВ не имеет.
Разряды 7..0 - TWD: Регистр данных шины TWI
Данные
8 бит составляют байт данных, который
необходимо передать следующим, или
последний принятый байт по двухпроводной
последовательной шине.
Регистр подчиненного адреса шины TWI - TWAR
Разряд | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE | |
Исх. значение | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Разряды 7..1 - TWA: Регистр подчиненного адреса TWI
Данные семь бит составляют подчиненный адрес блока TWI.
Разряд 0 - TWGCE: Бит разрешения обнаружения общего вызова по шине TWI
После
установки данного бита разрешается
работа схемы обнаружения общего
вызова, передаваемого по двухпроводной
последовательной шине.
Заключение
При
разработке программного обеспечения
был освоен язык «С». Изучены основы работы
периферийных устройств процессора Atmega16
и подробно разобран процесс обмена данными
между контроллером и термодатчиком по
TWI интерфейсу.
Разобраны
принципы действия систем автоматического
регулирования. А так же изучен алгоритм
вычисления коэффициентов для ПИД закона.
Следует отметить что при необходимости
наша система терпмостабилизации может
работать как П-регулятор так и ПИ- регулятор.
В
результате проведенной работы поставленная
цель была достигнута. Создано программное
обеспечение, позволяющее регулировать
значение температуры на основе ПИД закона.
Программа занимает 2572 байта памяти контроллера
и 21 байт энергонезависимой памяти.
Приложение
Текст программы:
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
void port_init(void) //инициализация ножек
контроллера
{
PORTA = 0x00;
DDRA = 0xF0; // 3 ножки
настроены на выход
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x84;
}
void watchdog_init(void) //инициализация
сторожевого таймера, предделитель: 16K
{
WDR();
WDTCR = 0x08; //сторожевой
таймер запущен
}
void timer0_init(void) //инициализация таймера
{
TCCR0 = 0x00; //остановка таймера
TCNT0 = 0x64; //установка счета
OCR0 = 0x9C; //установка сравнения
TCCR0 = 0x05; //запуск таймера
}
#pragma interrupt_handler timer0_ovf_isr:10
volatile char start;
void timer0_ovf_isr(void)
{
TCNT0 = 0x64; //
start=1;
}
void timer2_init(void)
{
TCCR2 = 0x00;
ASSR = 0x00;
TCNT2 = 0x01;
OCR2 = 0xFF;
TCCR2 = 0x79;
}
void twi_init(void)
//инициализация TWI
{
TWCR= 0X00; //отключение twi
TWBR= 0x64; //установка скорости передачи
TWSR= 0x00; //установка предделителя
TWAR= 0x00; //установка адреса ведомого устройства
TWCR= 0x04; //запуск twi
}
void init_devices(void)
//функция инициализирующая
{
CLI();
port_init();
watchdog_init();
timer0_init();
timer2_init();
twi_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01;
SEI();
}
//n from 1 to 4
void led(char n, char on)
//функция, зажигающая диод
{
if(on) //зажечь
PORTA|=1<<(n+3);
else //выключить
PORTA&=~( 1<<(n+3) );
}
void SetPWM(unsigned char val)
{
OCR2 = val;
}
float GetTemp(char adr)
//чтение температуры
{
float temper;
short int t;
char t_high,s,t_low;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<
while (!(TWCR & (1<<TWINT)));
//Ожидание установки флага TWINT. Этим
//индицируется завершение передачи условия
СТАРТ
if ((TWSR & 0xF8) != 0x08)
//Проверка кода состояния TWI. Маскир. бит
предделителя. //Если код состояния не
равен СТАРТ=0x08, то возвращается ошибочное
значение //температуры
return(130);
TWDR=((adr&7+0x9)<<1)
+ 1; //Загрузка ПОДЧИН_УСТР_АДР + ЧТЕНИЕ
в регистр TWDR
TWCR = (1<<TWINT) | (1<<TWEN); //Сброс бита
TWINT в TWCR для начала передачи адр.
while (!(TWCR & (1<<TWINT)));
//Ожидание установки флага TWINT. Этим //сигнализируется
завершение передачи ПОДЧИН_УСТР_АДР +
ЧТЕНИЕ и //получение/неполучение подтверждения
(ПОДТВ/НЕТ ПОДТВ)
if ((TWSR & 0xF8) != 0x40)
//Проверка значения регистра состояния.Маскирование
бит предделителя
return(130);
//Если состояние отличается от MR_ADR_ACK=0x40,то
возвращается ошибочное значение тем/ры
TWCR = (1<<TWINT) |(1<<TWEA) |
(1<<TWEN); //Сброс бита TWINT в TWCR для начала
//операции чтения первого байта с датчика.
Бит TWEA управляет генерацией импульса
//подтверждения. Если в бит TWEA записана
лог.1, то импульс ПОДТВ генерируется на
шине //TWI
while (!(TWCR & (1<<TWINT)));
//Ожидание установки флага TWINT. Этим //сигнализируется
завершение чтения первого байта
t_high=TWDR;
TWCR = (1<<TWINT) | (1<<TWEN); //Сброс
бита TWINT в TWCR для начала операции чтения
второго байта с датчика
while (!(TWCR & (1<<TWINT)));
//Ожидание установки флага TWINT. Этим сигнализируется
завершение чтения первого байта
t_low=TWDR;
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<
t= t_low+(t_high<<8);
s=(t&0x8000)==1;
t=t>>6;
if(s)
temper= t/4.0f;
else
temper= (t-512)/4.0f; //если температура
меньше нуля
return temper;
}
//
#pragma data:eeprom // «прошивка» энергонезависимой
памяти
float eU= 40;
float eK= 2;
float eTd= 3;
float eTi=4;
float eTk=0.01;
#pragma data:data
void led_temper(float
X) // эта функция зажигает один из диодов
в зависимости от того в
{
if (X>20)
{
if (X<30)
{
led(1,1); return;
}
if(X<40)
{
led(2,1); return;
}
if(X==130)
{
led(3,1); return;
}
}
else led(4,1);
}
void main(void)
{
float X_prev, summa, Y_val, X;
int U,K,Td,Ti;
float Tk;
WDTCR=(0<<WDE);
init_devices();
EEPROM_READ((int)&eU, U);
//чтение из энергонезависимой памяти
коэфициентов
EEPROM_READ((int)&eK, K);
EEPROM_READ((int)&eTd, Td);
EEPROM_READ((int)&eTk,Tk);
EEPROM_READ((int)&eTi,Ti);
X_prev=GetTemp(1);
while(1)
//бесконечный цикл
{
while(!start); start=0;
//задержка 10ms
X=GetTemp(1);
led_temper(X);
summa+=(U-X)*Tk;
Y_val=K*(U-X)+ summa/Ti+ Td*(X-X_prev)/Tk;
X_prev=X;
}
}
СПИСОК ЛИТЕРАТУРЫ