Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
06.04.2009, 12:09 | #62 |
Форумец
|
Не, на LPT переходник так просто не найти. Есть такая микросхема от FTDI FT245 (конвертер USB-FIFO), но гемморойно это. И опять же оболочка от ChipProg с ней, наверное, не позволит работать. Так что нужен LPT. А может карточки расширения под LPT поискать?
|
07.04.2009, 11:09 | #65 |
Форумец
|
А для чего нужен терморегулятор? Поясняю, если допустим это водонагреватель, то пойдет двухпозиционное регулирование (нагреватель включен или нагреватель выключен), а если это инкубатор, с жестким требованием к поддержанию температуры, то уже напрашивается ПИД регулирование.
|
07.04.2009, 12:44 | #67 | ||
Форумец
|
Цитата:
Цитата:
|
||
07.04.2009, 13:52 | #69 |
Форумец
|
Смотрите что получается. Нужно держать температуру 60 град. В начальный момент реально 25. Включается нагреватель и греет до 60, как только будет 60 нагреватель отключается, но моментально он не остывает, поэтому в зависимости от нагревателя, объема и т.д. реально температура поднимется больше 60 град. Остывает, температура падает до 60, включается нагреватель, но моментально он не разогреется, поэтому температура реально понизится ниже 60 град. и так и будет скакать около 60 град (так работает 2-х позиционный). И вот тут море вариантов, чтобы диапазон кол****ий температуры около 60 град был как можно меньше - программные хитрости - введение гистерезисов, отключение за 3 град до уставки и т.п. Но самый лучший вариант - это ПИД. Он будет уменьшать мощность нагревателя при подходе к уставке и увеличивать при отклонении от нее. При этом точность и скорость достижения нужного результата на порядки лучше двухпозиционного регулирования. И при этом это не очень-то и сложно.
|
07.04.2009, 14:57 | #70 |
Форумец
Сообщений: 552
Регистрация: 17.06.2005
Возраст: 40
Не в сети |
Я бы тоже с интересом последил за этим проектом( в особенности получение коэффициентов ПИД регулятора для ХХХ обьекта и ХХХ нагревателя)
т.е. как я понимаю необходимо будет провести эсперимент( а может пару) для получения параметров обьекта, а уже потом считать коэффициенты |
07.04.2009, 16:13 | #71 | |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
Цитата:
Хотя, для начала я думаю стоило бы двухпозиционный собрать. Или нет?... |
|
07.04.2009, 20:59 | #72 |
неламер
Сообщений: 2,557
Регистрация: 29.11.2005
Не в сети |
petrd если конструкция имеет жесткую привязку к тену тому же, то стоит с ацп снимать температуру и по этому дрейфу давать задержку.
|
08.04.2009, 07:47 | #73 |
Форумец
|
dr.ON
Пока с ПИД заморачиваться у меня нет времени (надо делать объект, собирать схему регулирования мощности нагревателя, опять же эксперименты с нагреванием-остыванием довольно длительный процесс), а программная реализация самого ПИД не сложная, тем более, что программные болванки под ПИД есть. А вот на примере ключевого DC/DC с ШИМ, наверное, попробую. romchik77 Да, для простоты лучше сначала двухпозиционный, а там видно будет устраивает или нет. $erega2net АЦП нет, так как думаю использовать схему ранее приведенного термометра на DS18B20. |
08.04.2009, 08:43 | #74 |
неламер
Сообщений: 2,557
Регистрация: 29.11.2005
Не в сети |
а смысл огород такой городить? не проще контроллер с ацп взять и на нем сразу термометр делать.
|
08.04.2009, 09:13 | #75 |
Форумец
|
|
08.04.2009, 10:34 | #76 |
неламер
Сообщений: 2,557
Регистрация: 29.11.2005
Не в сети |
ааа, там уже по цифре идет сигнал... я думал там термопара стоит и через отдельную микруху с нее читать температуру.
вообще у него минус есть. он тока до 85 градусов. я до 300 делаю счас. правда точность пониже. |
08.04.2009, 12:06 | #78 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
|
08.04.2009, 12:31 | #79 | |
Форумец
|
Цитата:
ЖКИ - может быть будут в РАДИОХИТ (чуть дальше в сторону ж/д вокзала) , в других местах не видел (знакосинтезирующий,4, 2 или 1 строка, 16-20 символов). По собственному опыту: купите кварцы на 4, 8 и 20 МГц, панельку под PIC, 7805, кнопки тактовые, макетку. Если будут вопросы (может чего нет, что на что заменить) то звоните тел. в личку сейчас закину. А так может еще кто из форума подскажет, где глянуть. |
|
08.04.2009, 13:21 | #80 |
Форумец
|
Термостат. Работает так. В верхней строке выводится текущая температура, в нижней уставка (целые градусы, шаг в один градус), в конце нижней строки выводится "0" (нагреватель выключен) или "1" (нагреватель включен). После прошивки и первом включении уставка - 25 градусов. Кнопка "Выше" увеличивает на 1 град, "Ниже" - уменьшает на 1 градус. После выключения уставка сохраняется в EEPROM. Уставка ограничена диапазоном 0-125 град, с шагом 1 градус. Если текущая температура меньше уставки на RA3 лог. "1" (на ЖКИ тоже "1") - включается исполнительное устройство, если текущая температура выше уставки на RA3 лог. "0" (на ЖКИ тоже "0") - исполнительное устройство выключается. Сравнение идет с целой частью текущей температуры.
Код:
const unsigned short TEMP_RESOLUTION = 12; unsigned short SetTemp, old_SetTemp; char *text = "000.0000"; char *set = "000"; unsigned temp; void Display_Temperature(unsigned int temp2write) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp_fraction; // преобразование отрицательной температуры if (temp2write & 0x8000) { text[0] = '-'; temp2write = ~temp2write + 1; } // извлечение целой части temp_whole = temp2write >> RES_SHIFT ; // преобразование целой части температуры в символы text[0] = temp_whole/100 + 48; // извлечение сотен text[1] = (temp_whole/10)%10 + 48; // извлечение десятков text[2] = temp_whole%10 + 48; // извлечение единиц // извлечение и преобразование дробной части temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x000F; temp_fraction *= 625; // преобразование дробной части в символы text[4] = temp_fraction/1000 + 48; // extract thousands digit text[5] = (temp_fraction/100)%10 + 48; // extract hundreds digit text[6] = (temp_fraction/10)%10 + 48; // extract tens digit text[7] = temp_fraction%10 + 48; // extract ones digit // вывод температуры на ЖКИ Lcd_Out(1, 7, text); set[0]=SetTemp/100+48; set[1]=(SetTemp/10)%10+48; set[2]=SetTemp%10+48; Lcd_Out(2,7,set); if (SetTemp>temp_whole){ // если уставка выше PORTA=8; // то включение Lcd_Chr(2,14,'1'); // и отображение "1" } else{ // если нет PORTA=0; // выключение Lcd_Chr(2,14,'0'); // и отображение "0" } }//~ void main() { CMCON = 7; // Все выводы цифровые входы-выходы TRISA=0b11110111; // все выводы PORTA на вход, RA3 - выход Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // назначение выводов ЖКИ - PIC Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Out(1, 1, "Temp:"); Lcd_Chr(1,15,223); // вывод символа точки и "С" как единицы измерения Lcd_Chr(1,16,'C'); Lcd_Out(2,1,"Set :"); Lcd_Chr(2,10,223); Lcd_Chr(2,11,'C'); SetTemp=Eeprom_Read(0); // читаем уставку из EEPROM if (SetTemp>125){ SetTemp=25; old_SetTemp=SetTemp; delay_ms(50); Eeprom_Write(0,SetTemp); delay_ms(50); } //--- главный цикл do { //--- чтение температуры из DS18B20 Ow_Reset(&PORTA,2); // сигнал сброса Ow_Write(&PORTA,2,0xCC); // команда SKIP_ROM Ow_Write(&PORTA,2,0x44); // команда CONVERT_T Delay_us(120); Ow_Reset(&PORTA,2); Ow_Write(&PORTA,2,0xCC); // команда SKIP_ROM Ow_Write(&PORTA,2,0xBE); // команда READ_SCRATCHPAD temp = Ow_Read(&PORTA,2); temp = (Ow_Read(&PORTA,2) << 8) + temp; if (Button(&PORTA, 0,1,0)){ // нажимаем кнопку на RA0 ("уставка выше") SetTemp++; if (SetTemp>125) SetTemp=125; } if (Button(&PORTA, 1,1,0)){ // нажимаем кнопку на RA1 ("уставка ниже") SetTemp-- ; if (setTemp==255) SetTemp=0; } if (old_SetTemp!= SetTemp) { // если было изменение уставки Eeprom_Write(0,SetTemp); // то сохраняем в EEPROM новое значение уставки delay_ms(50); old_SetTemp = SetTemp; // и сохраняем для текущей работы } //--- форматирование, вывод на ЖКИ температуры и уставки, включение-выключение Display_Temperature(temp); Delay_ms(500); } while (1); } Код:
const unsigned short TEMP_RESOLUTION = 12, OFFSET = 2; unsigned short SetTemp, old_SetTemp, state; char *text = "000.0000"; char *set = "000"; unsigned temp; void Display_Temperature(unsigned int temp2write) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp_fraction; // преобразование отрицательной температуры if (temp2write & 0x8000) { text[0] = '-'; temp2write = ~temp2write + 1; } // извлечение целой части temp_whole = temp2write >> RES_SHIFT ; // преобразование целой части температуры в символы text[0] = temp_whole/100 + 48; // извлечение сотен text[1] = (temp_whole/10)%10 + 48; // извлечение десятков text[2] = temp_whole%10 + 48; // извлечение единиц // извлечение и преобразование дробной части temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x000F; temp_fraction *= 625; // преобразование дробной части в символы text[4] = temp_fraction/1000 + 48; // extract thousands digit text[5] = (temp_fraction/100)%10 + 48; // extract hundreds digit text[6] = (temp_fraction/10)%10 + 48; // extract tens digit text[7] = temp_fraction%10 + 48; // extract ones digit // вывод температуры на ЖКИ Lcd_Out(1, 7, text); set[0]=SetTemp/100+48; set[1]=(SetTemp/10)%10+48; set[2]=SetTemp%10+48; Lcd_Out(2,7,set); // далее код стейт-машины (автомат конечных состояний) switch(state){ case 0: { if(temp_whole<SetTemp){ PORTA=8; Lcd_Chr(2,14,'1'); } else { PORTA=0; Lcd_Chr(2,14,'0'); state=1; } }; break; case 1: { if(temp_whole<(SetTemp-OFFSET)){ PORTA=8; Lcd_Chr(2,14,'1'); state=0; } else { PORTA=0; Lcd_Chr(2,14,'0'); } }; break; } // окончание стейт-машины }//~ void main() { state=0; CMCON = 7; // Все выводы цифровые входы-выходы TRISA=0b11110111; // все выводы PORTA на вход, RA3 - выход Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // назначение выводов ЖКИ - PIC Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Out(1, 1, "Temp:"); Lcd_Chr(1,15,223); // вывод символа точки и "С" как единицы измерения Lcd_Chr(1,16,'C'); Lcd_Out(2,1,"Set :"); Lcd_Chr(2,10,223); Lcd_Chr(2,11,'C'); SetTemp=Eeprom_Read(0); // читаем уставку из EEPROM if (SetTemp>125){ SetTemp=25; old_SetTemp=SetTemp; delay_ms(50); Eeprom_Write(0,SetTemp); delay_ms(50); } //--- главный цикл do { //--- чтение температуры из DS18B20 Ow_Reset(&PORTA,2); // сигнал сброса Ow_Write(&PORTA,2,0xCC); // команда SKIP_ROM Ow_Write(&PORTA,2,0x44); // команда CONVERT_T Delay_us(120); Ow_Reset(&PORTA,2); Ow_Write(&PORTA,2,0xCC); // команда SKIP_ROM Ow_Write(&PORTA,2,0xBE); // команда READ_SCRATCHPAD temp = Ow_Read(&PORTA,2); temp = (Ow_Read(&PORTA,2) << 8) + temp; if (Button(&PORTA, 0,1,0)){ // нажимаем кнопку на RA0 ("уставка выше") SetTemp++; if (SetTemp>125) SetTemp=125; } if (Button(&PORTA, 1,1,0)){ // нажимаем кнопку на RA1 ("уставка ниже") SetTemp-- ; if (setTemp==255) SetTemp=0; } if (old_SetTemp!= SetTemp) { // если было изменение уставки Eeprom_Write(0,SetTemp); // то сохраняем в EEPROM новое значение уставки delay_ms(50); old_SetTemp = SetTemp; // и сохраняем для текущей работы } //--- форматирование, вывод на ЖКИ температуры и уставки, включение-выключение Display_Temperature(temp); Delay_ms(500); } while (1); } Последний раз редактировалось petrd; 28.04.2009 в 15:38. Причина: исправил код, ошибка при отображении сотен градусов |
09.04.2009, 12:49 | #82 | |
Форумец
|
Цитата:
.......... Так Вас что больше интересует - софтовый SPI или карточка памяти. Если SPI, то проблем не вижу, если карточка типа MMC/SD, то PIC12 наверное не совсем то (да и две ноги свободных только останется), чтобы с ней работать (там же FAT все-таки). А если даже что и получится, то что с данными делать? В MikroC есть библиотека для работы с ними, но и та под PIC18. Так что меня "терзают смутные сомненья". Последний раз редактировалось petrd; 09.04.2009 в 13:41. |
|
09.04.2009, 16:26 | #83 |
mono all
Сообщений: 55
Регистрация: 12.07.2006
Не в сети |
я проверял в протеусе, подключил встроенную библиотеку soft_spi, попробывал считать ID флешки (at25f512a), так вот ничего не получилось, карточка конечно хорошо, и даже есть задумки как обойти фат, итого влезет вся прога даже 12f675 чип, d ,eleotv как разберусь хочу сделать муз. звонок или чего-нть даталогер. Проект могу выложить... (сойдёт под любой пик 12 серии, я думаю научусь даже на этом), прочитанные данные можно гнать по тому же spi в ЦАП c spi входом.
|
09.04.2009, 17:15 | #84 | |
Форумец
|
Цитата:
1. Думаю FAT обходить нет резона ибо тогда данные на карточку надо будет готовить отдельно и карточка станет уже не универсальной. Это как велик изобрететь. Кстати уже изобретено PIC16F628A+MMC только поискать, в том числе на www.microchip.su недавно об этом говорили. Опять же частоту PIC12F675 надо бы поднять до 20 МГц, а это внешний кварц, а ног-то всего 8, две из них питание, 4 на SPI, а выбирать между ЦАП и памятью уже чем. Ну не по задаче контроллер или задача не по контроллеру. 2. Звонок, ЦАП с SPI - опять велосипед, есть замечательный вариант вместо ЦАП использовать аппаратный ШИМ (Виктор Тимофеев (ник tester и testerplus) придумал RTOS OSA(http://wiki.pic24.ru/doku.php/osa/ref/intro), которая работает начиная с PIC10, так он на ней удивительные вещи творит, вот здесь пример http://wiki.pic24.ru/doku.php/osa/ref/appendix/quartet музыка без флешки на скромненьком PIC16F628A, я своему ребенку сделал - удивительная реализация. Нет я не против Ваших задумок, чем могу помогу, просто железо должно быть адекватно задаче. А иначе и время можно убить и велосипед не изобрести. Последний раз редактировалось petrd; 09.04.2009 в 18:50. |
|
09.04.2009, 20:59 | #85 |
mono all
Сообщений: 55
Регистрация: 12.07.2006
Не в сети |
Вот, пожалуйста посмотрите, наверняка где-то глюк, делал подобное на авр всё было ок, в смысле "протеза".
Насчёт велосипеда согласен на 100%, уже некуда и незачем его изобретать! Последний раз редактировалось mono; 10.04.2009 в 08:08. |
10.04.2009, 12:12 | #86 |
Форумец
|
Посмотрел, Вы были правы, глюки, причем все рукотворные. Вот смотрите:
Код:
/* Надо настроить проект: в Project -> Edit Project должны стоять галки _MCLRE_ON; _WDT_OFF; _INTRC_OSC_NOCLKOUT; у Вас же стоял кварц HS остальные не должны стоять. */ unsigned short take, buffer; // надо правильно определить тип данных, // в данном случае не влияет, но все же void main() { ANSEL = 0; CMCON = 7; //TRISIO = 0x00000010; // неверная запись, какой бит хотели установить? GPIO.4 //TRISIO = 0b000010; // если GPIO.1, то надо так или 0x02 TRISIO=0; // нас интересует только GPIO.2 назначенный как CS, // остальные компилятор сам назначит как надо под SPI и UART, поэтому я вот так написал GPIO = 0; Soft_Spi_Config(&GPIO,4,1,5); // надо переопределить SDI и SDO, у Вас SDO-SDO, SDI-SDI, надо SDI-SDO, SDO-SDI Soft_Uart_Init(GPIO, 3, 0, 9600, 0); do { GPIO.F2=0; // выставили CS (при цикле обращения должен быть равен 0) Delay_ms(50); Soft_Spi_Write(0x15); // команда чтения идентификатора Delay_ms(5); take=Soft_Spi_Read(buffer); Delay_ms(50); Soft_Uart_Write(take); GPIO.F2=1; // убрали CS Delay_ms(50); } while(1); } У меня такой памяти нет, поэтому смотрел в Протеусе. |
10.04.2009, 13:31 | #88 | |
Форумец
|
Цитата:
Код:
unsigned short take_1,take_2, buffer; void main() { ANSEL = 0; CMCON = 7; TRISIO=0; GPIO = 0; Soft_Spi_Config(&GPIO,4,1,5); Soft_Uart_Init(GPIO, 3, 0, 9600, 0); do { GPIO.F2=0; Delay_ms(50); Soft_Spi_Write(0x15); Delay_ms(5); take_1=Soft_Spi_Read(buffer); take_2=Soft_Spi_Read(buffer); Delay_ms(50); Soft_Uart_Write(take_1); Soft_Uart_Write(take_2); GPIO.F2=1; Delay_ms(50); } while(1); } |
|
10.04.2009, 14:01 | #89 |
mono all
Сообщений: 55
Регистрация: 12.07.2006
Не в сети |
Спасибо, всё работает как надо!
ещё один вопрос, нашёл самый простецкий программатор на LPT порт Epichttp://melabs.com/doclist.htm#EPIC с ним возможно работать? |
10.04.2009, 14:15 | #90 | |
Форумец
|
Цитата:
|
|