Например TDA7294

Форум РадиоКот • Просмотр темы - Электроника Для Компрессора
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс июл 27, 2025 22:16:53

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Электроника Для Компрессора
СообщениеДобавлено: Пн мар 21, 2016 16:09:23 
Родился

Зарегистрирован: Вс окт 16, 2011 07:22:48
Сообщений: 13
Рейтинг сообщения: 0
Всем доброго времени суток!Я новичек,так что сильно не ругайтесь.Собрал компрессор на базе ЗИЛ-130,вот теперь мудрю электронику,век технологий как не как.Алгоритм работы программы такой.При вкл.питания МК опрашивает датчики температуры DS18b20 выводит на семисегментник температуру первого датчика,после этого опрашивает второй датчик и если температура больше 40 гр. то опрашивает датчик давления и если он разрешает запуск то включает нужные порты и ставит флаг что компрессор работает.Дальше продолжает выводить температуру первого датчика на индикатор и опрашивать состояние датчика давления.когда датчик давления сработал,то выключаются нужные порты и ставиться флаг выключения.А если температура второго датчика меньше 40 гр. то вкл. подогреватель.Нашел схему термометра с несколькими датчиками и немного дописал под свои нужды.Температуру показывает,а остальное не делает.Уже всю голову сломал,не пойму что не так.Подскажите если не сложно.


Спойлер
Код:
#include <tiny2313.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=6
#endasm
// DS18x20 Temperature Sensor functions
#include "ds18x20_v2.h"
#include <delay.h>
#include <bcd.h>
//----------
#define A 2
#define B 32
#define C 4
#define D 64
#define E 128
#define F 1
#define G 1
static flash unsigned char digits_PA[] = {
(A+F), // 0
(0), // 1
(A), // 2
(A), // 3
(F), // 4
(A+F), // 5
(A+F), // 6
(A), // 7
(A+F), // 8
(A+F), // 9
(A+F), // A - 10
(F), // b - 11
(A+F), // C - 12
(0), // d - 13
(A+F), // E - 14
(A+F), // F - 15
(0), // 16 - знак минус
(A+F), // 17 - символ градус цельсия
(0) // 18 - пусто
};
static flash unsigned char digits_PB[] = {
(B+C+D+E), // 0
(B+C),     // 1
(B+D+E+G), // 2
(B+C+D+G), // 3
(B+C+G),     // 4
(C+D+G),     // 5
(C+D+E+G), // 6
(B+C),     // 7
(B+C+D+E+G), // 8
(B+C+D+G), // 9
(B+C+E+G), // A - 10
(C+D+E+G), // b - 11
(D+E),     // C - 12
(B+C+D+E+G), // d - 13
(D+E+G),     // E - 14
(E+G),     // F - 15
(G),         // 16 - знак минус
(B+G),     // 17 - символ градус цельсия
(0)         // 18 - пусто
};

#define MINUS 16
#define GRADUS 17
#define PROBEL 18
#define SYMBOL_F 15

// K1 - PORTD.0-1, K2 - PORTD.2-3, K3 - PORTD.4-5
static flash unsigned char cursor[]={0b1110100, 0b1111000, 0b1101100};
unsigned char digit_out[3], cur_dig;
bit zpt_ON;
int temperature;     // то, что возвращает верхний датчик
int temperature1;     // то, что возвращает нижний датчик
bit job=1;             //переменная состояния работы 1-выкл,0-вкл

// maximum number of DS1820/DS18S20/DS18B20 devices connected to the 1 Wire bus
#define MAX_DS18x20 4
// DS1820/DS18S20/DS18B20 devices ROM code storage area, 9 bytes are used for each device
unsigned char rom_code[MAX_DS18x20][9];

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {

PORTD|=0b00111100; // потушить все (биты всех знакомест "1" - для Общ.кат.)
   
PORTA=digits_PA[digit_out[cur_dig]]; // символ на экран
PORTB=digits_PB[digit_out[cur_dig]];
if ((zpt_ON == 1) && (cur_dig == 1)) PORTB.4=1; // запятая во втором разряде (нумерация нач. с нуля)   
PORTD&=(cursor[cur_dig]); // засветить нужный бит (бит знакоместа в "0" - для Общ.кат.)
cur_dig++; if (cur_dig > 2) cur_dig=0;
}
// ----------
void view_term(void) {
unsigned char celie, drob, tmp;
unsigned int temp, celie_tmp, drob_tmp;

temp = (unsigned int) temperature;
   
if (temperature>=0) {
digit_out[0]=PROBEL;     // первый символ (сотни) пустой
} else {   
temp = ( ~temp ) + 0x0001; // если число отрицательное перевести его в норм.вид
digit_out[0]=MINUS;     // и высветить знак минус (в дальнейшем атрибут отр.темп.)
};
//digit_out[3]=GRADUS;
zpt_ON=1;
celie_tmp = temp >> 4;             // целая часть числа
drob_tmp = temp & 0x000F;         // дробная часть числа с точностью 1/16 градуса
drob = (unsigned char) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса
celie = (unsigned char) celie_tmp; // я люблю явное преведение типов
if (celie >= 100) {tmp=bin2bcd(celie-100); digit_out[0] = 1; } else { tmp=bin2bcd(celie); } // вычислить целую часть
if ((celie >= 100) || ((digit_out[0] == MINUS) && (celie >= 10))) { // если больше 100,0 гр. или если темп. меньше -10 точность 1 гр.
zpt_ON=0;
digit_out[1] = tmp >> 4; // десятки
digit_out[2] = tmp & 0x0F; // единицы
}
if ((digit_out[0] == MINUS) && (celie < 10)) { // если темп.меньше 0 и больше -10 точность 0,1 гр.
digit_out[1] = celie; // единицы
digit_out[2] = drob; // дробная часть
}
if ((digit_out[0] == PROBEL) && (celie < 100)) { // если темп. меньше 100,0 гр и больше 0 гр точность 0,1 гр.
if (tmp >> 4) digit_out[0] = tmp >> 4; // десятки - если десятков нет то и не показывать
digit_out[1] = tmp & 0x0F;             // единицы
digit_out[2] = drob;                 // дробная часть
}
} // ----------

//================ main ===================
void main(void) {
unsigned char i, ds18x20_devices;

PORTA=0x00;
DDRA=0x03;

PORTB=0x00;
DDRB=0xFF;
// Port D initialization
PORTD=0b0100000;// State6=1 State5=T State4=1 State3=1 State2=1 State1=1 State0=1
DDRD=0b1011111; // Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// 1 Wire Bus initialization
w1_init();
// Determine the number of DS18x20 devices connected to the 1 Wire bus
ds18x20_devices=w1_search(0xf0,rom_code);
// Global enable interrupts
#asm("sei")
// высветить на индикаторе F 'кол-во найденых устройств'
digit_out[0]=SYMBOL_F;
digit_out[1]=PROBEL;
digit_out[2]=ds18x20_devices;
// т.к. при первом чтении датчиков считывается мусор
// первое чтение датчиков делаем в холостую
if (ds18x20_devices >= 1) {
for (i=0;i<ds18x20_devices;i++) {
if (rom_code[i][0] == DS18B20_FAMILY_CODE){
temperature=ds18b20_temperature(&rom_code[i][0]);
}
//if (rom_code[i][0] == DS18S20_FAMILY_CODE){
// temperature=ds18s20_temperature(&rom_code[i][0]);
}
delay_ms(1000);

} else {
delay_ms(2000);
}

// ---------- рабочая часть ----------
while (1) {
             temperature=ds18b20_temperature(&rom_code[1][0]); //опрос верхнего датчика
             view_term();
           
             temperature=ds18b20_temperature(&rom_code[0][0]); //опрос нижнего датчика
             temperature1=temperature;
       
         if (temperature1>=40)
{         if (PIND.5==1)     //опрос датчика давления 1-выкл,0-вкл
{         if (job==1)     //состояние работы 1-выкл,0-вкл
{
             PORTB.3=0; //Выключение подогревателя
             PORTD.1=1; //Включение клапана пуска
             delay_ms(500);
             PORTB.1=1; //Запуск двигателя
             delay_ms(1000);
             PORTD.1=0; //Выключение клапана пуска
           
             job=0;     //состояние работы вкл
}
}           
             if (PIND.5==0) //опрос датчика давления 1-выкл,0-вкл
{             if (job==0) //состояние работы 1-выкл,0-вкл
{                 PORTB.1=0; //Остановка двигателя
                 job=1;     //состояние работы выкл
}
}
}

else {
PORTB.3=1; //Включение подогревателя
}

};// ---------- рабочая часть (end) ----------
   
   
} // ================= end main =====


//
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= The End -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Starichok51 и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y