Activity
А что за интерполятор, если не секрет?
Доброго времени суток!
Не могу загрузить даташиту на контроллер pcd8544. Управляется по SPI.
Вот код на Сях с поддержкой русского языка.
Покупаю по 11 гривен в сети сотовой связи MOBILIZATION. Контакты прямо на стекле, только паяй.
#define nok_sclk RB7 // nokia lcd sclk
#define nok_sda RB6 // nokia lcd sda
#define nok_dc RB5 // nokia lcd d/!c
#define nok_cs RA2 // nokia lcd !cs
#define nok_res RA1 // nokia lcd !res
#define DIM(a) (sizeof(a) / sizeof(a[0])) //определяем размер массива
//***********************************************************************************
const char table[820] = { 0x00,0x00,0x00,0x00,0x00, // 20 space ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes
0x00,0x00,0x5f,0x00,0x00, // 21 ! Note that this is the same set of codes for character you
0x00,0x07,0x00,0x07,0x00, // 22 " would find on a HD44780 based character LCD. 😃
0x14,0x7f,0x14,0x7f,0x14, // 23 # Also, given the size of the LCD (84 pixels by 48 pixels),
0x24,0x2a,0x7f,0x2a,0x12, // 24 $ the maximum number of characters per row is only 14. 😃
0x23,0x13,0x08,0x64,0x62, // 25 %
0x36,0x49,0x55,0x22,0x50, // 26 &
0x00,0x00,0x07,0x00,0x00, // 27 ’
0x00,0x1c,0x22,0x41,0x00, // 28 (
0x00,0x41,0x22,0x1c,0x00, // 29 )
0x14,0x08,0x3e,0x08,0x14, // 2a *
0x08,0x08,0x3e,0x08,0x08, // 2b +
0x00,0x50,0x30,0x00,0x00, // 2c ,
0x08,0x08,0x08,0x08,0x08, // 2d -
0x00,0x60,0x60,0x00,0x00, // 2e .
0x20,0x10,0x08,0x04,0x02, // 2f /
0x3e,0x51,0x49,0x45,0x3e, // 30 0
0x00,0x42,0x7f,0x40,0x00, // 31 1
0x42,0x61,0x51,0x49,0x46, // 32 2
0x21,0x41,0x45,0x4b,0x31, // 33 3
0x18,0x14,0x12,0x7f,0x10, // 34 4
0x27,0x45,0x45,0x45,0x39, // 35 5
0x3c,0x4a,0x49,0x49,0x30, // 36 6
0x01,0x71,0x09,0x05,0x03, // 37 7
0x36,0x49,0x49,0x49,0x36, // 38 8
0x06,0x49,0x49,0x29,0x1e, // 39 9
0x00,0x36,0x36,0x00,0x00, // 3a :
0x00,0x56,0x36,0x00,0x00, // 3b ;
0x08,0x14,0x22,0x41,0x00, // 3c <
0x14,0x14,0x14,0x14,0x14, // 3d =
0x00,0x41,0x22,0x14,0x08, // 3e >
0x02,0x01,0x51,0x09,0x06, // 3f ?
0x32,0x49,0x79,0x41,0x3e, // 40 @
0x7e,0x11,0x11,0x11,0x7e, // 41 A
0x7f,0x49,0x49,0x49,0x36, // 42 B
0x3e,0x41,0x41,0x41,0x22, // 43 C
0x7f,0x41,0x41,0x22,0x1c, // 44 D
0x7f,0x49,0x49,0x49,0x41, // 45 E
0x7f,0x09,0x09,0x09,0x01, // 46 F
0x3e,0x41,0x49,0x49,0x7a, // 47 G
0x7f,0x08,0x08,0x08,0x7f, // 48 H
0x00,0x41,0x7f,0x41,0x00, // 49 I
0x20,0x40,0x41,0x3f,0x01, // 4a J
0x7f,0x08,0x14,0x22,0x41, // 4b K
0x7f,0x40,0x40,0x40,0x40, // 4c L
0x7f,0x02,0x0c,0x02,0x7f, // 4d M
0x7f,0x04,0x08,0x10,0x7f, // 4e N
0x3e,0x41,0x41,0x41,0x3e, // 4f O
0x7f,0x09,0x09,0x09,0x06, // 50 P
0x3e,0x41,0x51,0x21,0x5e, // 51 Q
0x7f,0x09,0x19,0x29,0x46, // 52 R
0x46,0x49,0x49,0x49,0x31, // 53 S
0x01,0x01,0x7f,0x01,0x01, // 54 T
0x3f,0x40,0x40,0x40,0x3f, // 55 U
0x1f,0x20,0x40,0x20,0x1f, // 56 V
0x3f,0x40,0x38,0x40,0x3f, // 57 W
0x63,0x14,0x08,0x14,0x63, // 58 X
0x07,0x08,0x70,0x08,0x07, // 59 Y
0x61,0x51,0x49,0x45,0x43, // 5a Z
0x00,0x7f,0x41,0x41,0x00, // 5b [
0x02,0x04,0x08,0x10,0x20, // 5c Yen Currency Sign
0x00,0x41,0x41,0x7f,0x00, // 5d ]
0x04,0x02,0x01,0x02,0x04, // 5e ^
0x40,0x40,0x40,0x40,0x40, // 5f _
0x00,0x01,0x02,0x04,0x00, // 60 `
0x20,0x54,0x54,0x54,0x78, // 61 a
0x7f,0x48,0x44,0x44,0x38, // 62 b
0x38,0x44,0x44,0x44,0x20, // 63 c
0x38,0x44,0x44,0x48,0x7f, // 64 d
0x38,0x54,0x54,0x54,0x18, // 65 e
0x08,0x7e,0x09,0x01,0x02, // 66 f
0x0c,0x52,0x52,0x52,0x3e, // 67 g
0x7f,0x08,0x04,0x04,0x78, // 68 h
0x00,0x44,0x7d,0x40,0x00, // 69 i
0x20,0x40,0x44,0x3d,0x00, // 6a j
0x7f,0x10,0x28,0x44,0x00, // 6b k
0x00,0x41,0x7f,0x40,0x00, // 6c l
0x7c,0x04,0x18,0x04,0x78, // 6d m
0x7c,0x08,0x04,0x04,0x78, // 6e n
0x38,0x44,0x44,0x44,0x38, // 6f o
0x7c,0x14,0x14,0x14,0x08, // 70 p
0x08,0x14,0x14,0x18,0x7c, // 71 q
0x7c,0x08,0x04,0x04,0x08, // 72 r
0x48,0x54,0x54,0x54,0x20, // 73 s
0x04,0x3f,0x44,0x40,0x20, // 74 t
0x3c,0x40,0x40,0x20,0x7c, // 75 u
0x1c,0x20,0x40,0x20,0x1c, // 76 v
0x3c,0x40,0x30,0x40,0x3c, // 77 w
0x44,0x28,0x10,0x28,0x44, // 78 x
0x0c,0x50,0x50,0x50,0x3c, // 79 y
0x44,0x64,0x54,0x4c,0x44, // 7a z
0x00,0x08,0x36,0x41,0x00, // 7b <
0x00,0x00,0x7f,0x00,0x00, // 7c |
0x00,0x41,0x36,0x08,0x00, // 7d >
0x08,0x08,0x2A,0x1C,0x08, // 7e Right Arrow ->
0x08,0x1C,0x2A,0x08,0x08, // 7f Left Arrow <-
0x04,0x02,0x7F,0x02,0x04, // 80 UP Arrow
0x10,0x20,0x7F,0x20,0x10, // 81 Down Arrow
0x00,0x06,0x09,0x06,0x00, // 82 градус
0x5A,0x3C,0xE7,0x3C,0x5A, // 83 SUN
0x7C,0x0A,0x09,0x09,0x7F, // А
0x7F,0x49,0x49,0x49,0x31, // Б
0x7F,0x49,0x49,0x49,0x36, // В
0x7F,0x01,0x01,0x01,0x03, // Г
0x60,0x3E,0x21,0x3F,0x60, // Д
0x7F,0x49,0x49,0x41,0x41, // Е
0x77,0x08,0x7F,0x08,0x77, // Ж
0x22,0x41,0x49,0x49,0x36, // З
0x7F,0x10,0x08,0x04,0x7F, // И
0x7F,0x10,0x09,0x04,0x7F, // Й
0x7F,0x08,0x14,0x22,0x41, // К
0x40,0x3E,0x01,0x01,0x7F, // Л
0x7F,0x02,0x04,0x02,0x7F, // М
0x7F,0x08,0x08,0x08,0x7F, // Н
0x3E,0x41,0x41,0x41,0x3E, // О
0x7F,0x01,0x01,0x01,0x7F, // П
0x7F,0x09,0x09,0x09,0x06, // Р
0x3E,0x41,0x41,0x41,0x22, // С
0x03,0x01,0x7F,0x01,0x03, // Т
0x27,0x48,0x48,0x48,0x3F, // У
0x0E,0x11,0x7F,0x11,0x0E, // Ф
0x63,0x14,0x08,0x14,0x63, // Х
0x3F,0x20,0x20,0x3F,0x60, // Ц
0x07,0x08,0x08,0x08,0x7F, // Ч
0x7F,0x40,0x7F,0x40,0x7F, // Ш
0x3F,0x20,0x3F,0x20,0x7F, // Щ
0x01,0x7F,0x48,0x48,0x30, // Ъ
0x7F,0x48,0x30,0x00,0x7F, // Ы
0x7F,0x48,0x48,0x30,0x00, // Ь
0x22,0x49,0x49,0x49,0x3E, // Э
0x7F,0x08,0x3E,0x41,0x3E, // Ю
0x46,0x29,0x19,0x09,0x7F, // Я
0x20,0x54,0x54,0x38,0x40, // а
0x3C,0x4A,0x4A,0x4A,0x31, // б
0x7C,0x54,0x54,0x54,0x28, // в
0x7C,0x04,0x04,0x04,0x04, // г
0x60,0x38,0x24,0x3C,0x60, // д
0x38,0x54,0x54,0x54,0x18, // е
0x6C,0x10,0x7C,0x10,0x6C, // ж
0x28,0x44,0x54,0x54,0x28, // з
0x7C,0x20,0x10,0x08,0x7C, // и
0x7C,0x20,0x12,0x08,0x7C, // й
0x7C,0x10,0x10,0x28,0x44, // к
0x40,0x38,0x04,0x04,0x7C, // л
0x7C,0x08,0x10,0x08,0x7C, // м
0x7C,0x10,0x10,0x10,0x7C, // н
0x38,0x44,0x44,0x44,0x38, // о
0x7C,0x04,0x04,0x04,0x7C, // п
0x7C,0x24,0x24,0x24,0x18, // р
0x38,0x44,0x44,0x44,0x28, // с
0x04,0x04,0x7C,0x04,0x04, // т
0x4C,0x50,0x50,0x50,0x3C, // у
0x18,0x24,0x7C,0x24,0x18, // ф
0x44,0x28,0x10,0x28,0x44, //х
0x3C,0x20,0x20,0x3C,0x60, // ц
0x1C,0x20,0x20,0x20,0x7C, // ч
0x7C,0x40,0x7C,0x40,0x7C, // ш
0x3C,0x20,0x3C,0x20,0x7C, // щ
0x04,0x7C,0x48,0x48,0x30, // ъ
0x7C,0x48,0x30,0x00,0x7C, // ы
0x7C,0x48,0x48,0x48,0x30, // ь
0x54,0x54,0x54,0x54,0x38, // э
0x7C,0x10,0x38,0x44,0x38, // ю
0x48,0x54,0x34,0x14,0x7C //я
};
//**********************************************************************************
void init_nokia(void)
{
// nokia LCD init
nok_dc=1; // bytes are stored in the display data ram, address counter, incremented automatically
nok_cs=1; // chip disabled
DelayMs(10);
nok_res=0; // reset chip during 250ms
DelayMs(250);
nok_res=1;
// set extins extended instruction set
nokia_write_command(0x21);
// Vop was 0xc5 // better is 0xa0
nokia_write_command(0xa0);
// bias
nokia_write_command(0x13);
// horizontal mode from left to right, X axe are incremented automatically , 0x22 for vertical addressing ,back on normal instruction set too
nokia_write_command(0x20);
// all on
nokia_write_command(0x09);
DelayMs(50);
// DelayMs(250);
nokia_clear(); // reset DDRAM, otherwise the lcd is blurred with random pixels
DelayMs(10);
// mod control blank change (all off)
nokia_write_command(0x08);
DelayMs(10);
// mod control normal change
nokia_write_command(0x0c);
// nokia_gotoxy(0,0);
}
//*******************************************************************************
void nokia_write_command(unsigned char command_in)
{
nok_dc=0; // byte is a command it is read with the eight SCLK pulse
nok_cs=0; // chip enabled
clockdata(command_in);
nok_cs=1; // chip disabled
}
//*******************************************************************************
void nokia_write_data(unsigned char data_in)
{
nok_dc=1;
nok_cs=0; // chip enabled
clockdata(data_in);
nok_cs=1; // chip disabled
}
//*******************************************************************************
void clockdata(unsigned char bits_in)
{
signed char bitcnt;
for (bitcnt = 8; bitcnt > 0; bitcnt–)
{
nok_sclk = 0; // Set Clock Idle level LOW.
if ((bits_in&0x80)==0x80) {nok_sda = 1;} // PCD8544 clocks in the MSb first.
else {nok_sda = 0;}
nok_sclk = 1; // Data is clocked on the rising edge of SCK.
bits_in = bits_in<<1; // Logical shift data by 1 bit left.
}
}
//*******************************************************************************
//*******************************************************************************
void nokia_clear(void) // очистка экрана DDRAM (установка всех бит в 0)
{
signed char ch, cm, cl;
nok_sda=0;
nok_dc=1;
nok_cs=0;
for (ch=6;ch>0;ch–){ // 6 rows
for (cm=84;cm>0;cm–){ // 84 columns
for (cl=8;cl>0;cl–){ // 8 pixels
nok_sclk=0;
nok_sclk=1;
}
}
}
nok_cs=1;
}
//*******************************************************************************
void nokia_gotoxy (unsigned char xnokia, unsigned char ynokia) // Nokia LCD Position cursor
{
// bytefornokia=(0x40|(ynokia&0x07)); // Y axe initialisation: 0100 0yyy
nokia_write_command(0x40|(ynokia&0x07));
// bytefornokia=(0x80|(xnokia&0x7f)); // X axe initialisation: 1xxx xxxx
nokia_write_command(0x80|(xnokia&0x7f));
}
//*******************************************************************************
void putchar(unsigned char character)
{
int tablept;
signed char count;
unsigned char char_column;
if ((character<0x20)) {return;} // Exit function if character is not found.
if(character > 191)
{
tablept = ((5*(character-60)) - 160);
}
else
{
tablept = ((5*character) - 160); // Point to the columns of the character in the table.
}
for (count=5;count>0;count–) // Draw the columns to print the character.
{
char_column = table[tablept];
nokia_write_data(char_column);
tablept++;
}
nokia_write_data(0x00); // 1 pixel spacing per character.
}
//*********************************************************************************
void putstr(const char *s)
{
while(*s) {putchar(*s++); } // Points to one ASCII to be written one at a time.
}
Как я говорил АЦП 10 разрядный. Один бит соответствует 0.25 вольтам, итого для 250 вольт 0х3Е8. Период работы ПИДа 4 миллисекунды по таймеру. После измерения результат загоняю в фильтр, работающий по принципу “скользящее среднее” с 2 в степени n (какое нужно усреднение и время реакции системы). Плюс сигнал после делителя фильтруется дросселями и кондёрами на землю и далее электролит на 0.47 микрофарад. При первом включении произвожу калибровку АЦП (встроенная функция). Измеряемое напряжение (вывожу во время реза на дисплей) прыгает в диапазоне 0.5 - 1.5 вольт на ровном листе. Как я говорил, основная трабла с резом углов более 45 градусов и маленьких отверстий. В плагине для Мача есть отключение контроля в этих ситуациях, но как-бы это переделать в отдельный плагин, и просто выдавать в порт команду на отключение контроля? Есть у кого опыт работы с плагинами Мача??
Вроде схемку выкладывал ранее в теме.
Программу же ещё следует отрабатывать (устранение провалов резака на отверстиях). Да и в конечном устройстве уже будет немножко другое управление и индикация (механический энкодер и дисплей 2х20). На фото тестовая версия для отработки алгоритма.
Доброго времени суток!
ДДолго отсутствовал. Дело гляжу потихоньку идёт.
Почти закончил контроллер высоты для плазмы. Как и писал ранее контроллер PIC18F25J10. Напряжение с делителя на 10битный АЦП. Цифровой фильтр. ПИД регулирование скорости движения привода по высоте (шаговик через контроллер LEADSHINE). Датчики пределов движения каретки плюс плавающее крепление резака. Плазма 150 А китайская. Настраиваю : высоту поджига, высоту прокола, высоту резки, время прокола, время задержки подачи сигнала на КОМП ARC_OK, задержка отката после выключения торча, высота отката после отключения торча и переходом к новому месту прокола, напряжение дуги от 50 до 200 вольт, размер шага двигателя привода ( до 1 микрона), скорости позиционирования и движения в ручном режиме. Качество резки довольно хорошее, и резка стала намного проще и быстрее.
Самые большие грабли - это помехи 😦. Пока не сделал полную гальваническую развязку всех датчиков контроллер глючил как только мог. С плазмы беру отрицательное напряжение на делитель до осцилятора. Плюс прямо с заземления стола, к нему же экран.
Чно нужно сделать: на прямых и острых углах реза невооружённым глазом видно, что резак немного “ныряет” вниз. Тоже самое при резе отверстий малых диаметров и в конце реза детали, когда отверстие расширяется. Происходит довольно резкое повышение напряжения дуги и контроллер естественно пытается его отработать. В случае с отверстиями - резка вообще идёт прямо в отверстии 😦. и оно получается сами понимаете…
Вижу два путя выхода: давать в контроллер команду с компа на отключение контроля напряжения во время резки дырок и острыхо углов детали (требуется редактирование Г-кодов). Или придумать хитрый алгоритм обнаружения этих ситуаций и отключение слежения за напряжением дуги (хотя я уже пытался отслеживать быстрые изменения напряжения, но это приводит к замедлению скорости отработки по высоте, особенно на перепадах высоты металла в 40- 50 миллиметров.)
Shad71, оказывается я не прочитал первую часть этой статьи, где объясняется принцип её работы. Попробую на Атмеле реализовать эту схему.
Принцип основан на измерении тактовой частоты контроллера. Вообще стрёмно, на вход тактового генератора вешать антенну, находящуюся рядом с резаком. Уровень наводок очень велик. Глядишь подвиснет.
Вот ещё одна реализация емкостного датчика, точнее принцип. Используются встроенные компараторы. При изменении ёмкости частота генератора, собранного на них меняется. По двум таймерам засекаем это дело и с достоверной точностью говорим о приближении к детали.
Мужики, ктонибудь сможет помочь работающей схемкой датчика, ёмкостного или индективного?
Так я вроде выше уже давал работающую схемку. Если тяжело окомпилить могу помочь получитьь HEX.
Но иногда бывают моменты когда емкостной контроль не срабатывает - например при проколе на самом краю листа - т.е. площадь материала которая попадает в область антенки мала и система не срабатывает.
Если не военная тайна 😎 - какой формы у Вашего станка емкостной датчик? Кольцо или ещё что - то??
Народ!
Поправьте меня если где-то ошибся в алгоритме работы THC
Получаем команду включения плазмы - опускаемся до детали -определяем 0 - поднимаемся на высоту прокола - включение плазмы- контроль появления дуги,прокол - пауза (устанавливается в настройках обычно до 1 сек.) для первого прокола - переход на контроль напряжения дуги - резка. Вроде так, может что-то упустил?
Всё работало хорошо, но иногда (два раза) по неизвестной причине у меня сгорали дорожки.
Контроллер то жив остался? 😮
Вобщем потом я просто высоковольтный вход через делитель подключил к оптрону, и с другой сторны на транзисторе измеряю его сопротивление. Вобщем мне понравилась такая опторазвязка.
Оптопара светодиод - транзистор имеет большую нелинейность. С такой же нелинейностью будете мерять напряжение, ведь диапазон изменения от 50 до 300 вольт довольно широкий. В схеме из мануала, я бы после моста поставил сапрессор вольт на 40. Вроде так
В идеале нужно делать полную гальваническую развязку цепей делителя и контроллера. Например собрать измеритель напряжения на дешёвом контроллере типа 12F675 и передавать информацию в контроллер THC через оптопару манчестерским кодом.
Преимущество работы с антенкой т.е. с емкостным датчиком: металл который режете никогда не бывает идеально ровный или одинаков по толщине и датчик позволяет как бы копировать поверхность металла.
Доброго времени суток! Я считал, что антеннка нужна для начального определения высоты детали. Дальше контроль идёт исключительно по напряжению дуги. Или я что-то не понял?? 😃
Доброго времени суток!
Вот набросал схемку контроллера THC для станка плазменной резки металла. Гальваническая развязка с компом, управление двигателем через контроллер с интерфейсом STEP/DIR. Завис на процедуре определения точки касания детали. Может сделать плавающий подвес резака и при касании будет замыкаться концевик? Х.З. Не хочется ставить антенну, стаканы с вырезами, потому что приходится иногда резать металл похожий на черепицу. 😵 Однозначно будет цеплять.
На схеме индикатор 16х2 строк, будет цепляться к порту PORTB0-3. Триггер лишний.
Ещё есть входной делитель и схема ARC_GOOD. Пока на бумаге.
Действительно у Хипертерма после сопла идёт ещё один конусный стакан, похожий на сопло. Вот им они и касаются металла.
По схеме емкостного датчика есть здесь newsrack.ru/content/view/466/25/1/1/
Прошивка прилагается.
Если измерить сопротивление между анодом и соплом получается примерно 9 Ом (плазма Mishele).
Народ! Доброго времени суток.
А почему бы не определять начальную позицию резака по касанию сопла к металлу детали? Если измерить сопротивление между катодом и соплом получается примерно 9 Ом (плазма Mishele). При касании соплом детали сопротивление падает до 4 Ом. Измерить и начать отсчёт от этой точки. Так делают практически все производители (Built-in Ohmic touch-retract initial height sensing (IHS) так этот метод называет Hypertherm). Единственная загвоздка это гальваническая развязка измерительной цепи от сопла в момент поджига (до 9000 вольт) и резки. Да и отловить изменение сопротивления с 9 Ом до 4 трудновато, но реализуемо. Зато простота решения, сборки и эксплуатации на высоте. Есть ли толковые схемотехники? 😃
Может примерно так?
Да, с ПИД маханул 😵
Видится так.
Подъезжаем к металлу и касаемся нежно форсункой - получаем 0. Отъезжаем миллиметров на 12 и включаем плазму, одновременно смотрим на появление дуги (через трансформатор тока). Пошла дуга, меряем напряжение и регулируем высоту в соответствии с заданным значением. Естественно контролируем уход напряжения за критические пределы. Быстродействия большого не надо (до 1000 измерений в секунду), даже желательно пропустить значение напряжения через цифровой сглаживающий фильтр. Измеренное напряжение выводим на ЖКИ. В меню задаём толщину металла, с которым работаем. Получается интеллектуальный регулятор, не отнимающий ресурсы от Маха. Какие мысли. 😒
Доброго времени суток!
А если автономно микроконтроллером измерять напряжение дуги и регулировать высоту резака ШД по ПИД алгоритму?
Привод делали по AN1162 Sensorless Field Oriented Control (FOC) of an
AC Induction Motor (ACIM) от Микрочипа?
Доброго времени суток!
Уважаемый Художник! Получился ли сервопривод на ДПТ и микроконтроллере от Микрочипа??