Перейти к содержанию
    

roman_golovenkov

Участник
  • Постов

    79
  • Зарегистрирован

  • Посещение

Весь контент roman_golovenkov


  1. На страничке, которую Вы дали, все очень даже хорошо расписано!! Касательно записи в eeprom, все есть в апноутах (прилагаю). И еще, если записывать раз в 60мин, возможно придется усреднять полученные данные (среднечасовая температура). AVR100_EEPROM.pdf avr100.zip
  2. Написал код для фильтра простого скользящего среднего. Покритикуйте, пожалуйста, мож что не правильно. Перед прошивкой хорошоб от ошибок избавиться (кол-во сэмплов avgLenght) буду подбирать на месте, практически. На этой неделе цель оцифровать сигнал без фильтра, с аналоговым rc. и передать по uart на комп (записать в файл, например эксель, если получится, пока не знаю как :( ) Хорошо б и цифровой опробовать. ЗЫ: Обрабатываю пока первую картинку. #include <mega16.h> #include <delay.h> #include <stdio.h> unsigned char i = 0; float adc_data_volt; const float k = 0.0025; int avgLenght = 30; float mass[avgLenght]; //Ring initialisation service routing void initRing () { unsigned int i; for (i = 0; i < avgLenght; i++); { mass[i] = 0; } } //Filter service routing float movingAverage (float data_in) { static int i = 0; int j,k; float avg = 0.0; int indexBegin = (i - avgLenght) < 0 ? 0 : (i - avgLenght); for (k = indexBegin; k < (avgLenght - 1); k++) { mass[k] = mass[k+1]; } mass[avgLenght-1] = data_in; for (j = 0; j < avgLenght; j++) { avg += mass[j]; } i++; return avg = avg/avgLenght; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { i++; if (i == 3) { i = 0; ADCSRA = 0xCE; }; } #define ADC_VREF_TYPE 0xC0 //#define NON_FILTER #define D_FILTER #ifdef NON_FILTER // ADC interrupt service routine interrupt [ADC_INT] void adc_isr(void) { unsigned int adc_data; // Read the AD conversion result adc_data = ADCW; adc_data_volt = adc_data*k; printf ("%f; ", adc_data_volt); } #endif #ifdef D_FILTER interrupt [ADC_INT] void adc_isr(void) { unsigned int adc_data; float data_out; // Read the AD conversion result adc_data = ADCW; adc_data_volt = adc_data*k; data_out = movingAverage(adc_data_volt); printf ("%f; ", data_out); } #endif
  3. Эти сигналы идут с хемилюминографа (ФЭУ), и по факту - это не шум. Просто нужно "усреднить " данные, получить достаточно линейный график.
  4. Компилировал в CoDeVision
  5. Большое всем спасибо за помощь! Сделал вывод, что следует использовать RC фильтр 1 порядка + скользящего среднего (читал, что при использовании цифрового все равно на до аналоговый с частотой среза равной частоте дискретизации). А АЦП двойного интегрирования не следует? Чем плох? И еще одна загвоздка, обрабатывать придется сигнал и другого типа (рис прилагается), Но первый нужный пик появляется за долисекунды (примерно 0,1) - на этой же частоте и дальнейшие шумы. Нужно снять амплитуды первого пика и вершины горба. Я думаю может примениь такой алгоритм: без фильтров снимаем первый пик, когда после появляется резкий скачок вниз - включаем цифровой фильтр, но тогда не получится подключить аналоговый фильт (который на частоту дискретизации) (( И andron86, что значит 1-10 нФ?
  6. Попробуйте этот код, ток у меня на 16 меге. Все работает: ив Протеусе, и в железе. #include <mega16.h> #include <delay.h> // Задание выводимой строки текста. char flash *static_text = "Hello, world!"; // Задание регистров порта подключения ЖКИ-модуля. #define LCD_PORT PORTD #define LCD_DDR DDRD // Задание номера бита порта для вывода сигнала Е. #define LCD_E PORTD3 // Задание номера бита порта для вывода сигнала RS. #define LCD_RS PORTD2 // Команда очистки экрана. #define CLEAR_COMMAND 0b00000001 // Команда возврата курсора на начальную позицию. #define HOME_COMMAND 0b00000010 // Команда выбора направления сдвига курсора и экрана: // инкремент счетчика адреса, // без сдвига изображения. #define EMS_COMMAND 0b00000110 // Команда выбора отображения: // изображение включено, // курсор в виде подчерка выключен, // курсор в виде мерцающего знакоместа выключен. #define DISPLAY_COMMAND 0b00001100 // Команда задания сдвига курсора или экрана. //#define SHIFT_COMMAND 0b0001xx-- // Команда инициализации и задания режима работы индикатора // для 8-разрядного режима работы шины данных: // 4-хразрядная шина данных. // Здесь тетрады переставлены местами для корректной работы // подпрограммы записи команды в ЖКИ-модуль. #define INIT_8_COMMAND 0b00000010 // Команда инициализации и задания режима работы индикатора: // использование двухстрочного режима отображения информации, // матрица 5х8 точек, // 4-хразрядная шина данных. #define INIT_COMMAND 0b00101000 // Команда задания адреса в CGRAM. #define CGRAM_COMMAND 0b01000000 // Команда задания адреса в DDRAM. #define DDRAM_COMMAND 0b10000000 // Смещение первого знакоместа второй строки. #define SECOND_ROW 0x40 // Количество одновременно отображаемых символов на ЖКИ. #define TOTAL_CHARS 16 // Длительность программных задержек. #define INIT_DELAY 50 #define INIT_CONTROL_DELAY 50 #define WAIT_LINE_DELAY 1 #define WRITE_DATA_DELAY 50 #define WRITE_DATA_LONG_DELAY 2000 // Переставляет тетрады в байте. #pragma warn- unsigned char swap(unsigned char data) { #asm ld r30, Y swap r30 #endasm } #pragma warn+ // Определение задержки для формирования сигналов на линиях. #define lcd_wait_line() delay_us(WAIT_LINE_DELAY) // Записывает данные в ЖКИ-модуль. void _lcd_write_data(unsigned char data) { unsigned char lsn; // Вывод данных на 4-хразрядную шину. // Получение и вывод старшей тетрады. lsn = LCD_PORT & 0x0F; LCD_PORT = data & 0xF0 | lsn; // Установка стробирующего сигнала Е. LCD_PORT.LCD_E = 1; // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT.LCD_E = 0; // Задержка сигнала на линии. lcd_wait_line(); // Получение и вывод младшей тетрады. LCD_PORT = swap(data) & 0xF0 | lsn; // Установка стробирующего сигнала Е. LCD_PORT.LCD_E = 1; // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT.LCD_E = 0; // Задержка сигнала на линии. lcd_wait_line(); // Формирование задержки для ожидания выполнения команды ЖКИ-модулем. if (!LCD_PORT.LCD_RS && (CLEAR_COMMAND == data || HOME_COMMAND == data)) { delay_us(WRITE_DATA_LONG_DELAY); } else { delay_us(WRITE_DATA_DELAY); } } // Записывает команду в регистр IR ЖКИ-модуля. void lcd_control(unsigned char control) { // Установка линии RS в низкое состояние - сигнал записи команды. LCD_PORT.LCD_RS = 0; // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data(control); } // Записывает команду в регистр IR ЖКИ-модуля при инициализации. void lcd_init_control(unsigned char control) { lcd_control(control); // Задержка при инициализации должна быть больше. delay_ms(INIT_CONTROL_DELAY); } // Записывает символ в регистр DR ЖКИ-модуля. void lcd_putchar(unsigned char c) { // Установка линии RS в высокое состояние - сигнал записи данных. LCD_PORT.LCD_RS = 1; // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data©; } // Инициализирует ЖКИ-модуль. void lcd_init(void) { // Порт подключения ЖКИ-модуля работает на вывод. LCD_DDR |= 0b11111100; // Предварительная задержка. delay_ms(INIT_DELAY); // Отправка команды инициализации для 8-разрядного режима работы шины // данных, переключение на 4-хразрядную шину. lcd_init_control(INIT_8_COMMAND); // Отправка команды инициализации уже для 4-хразрядного режима. lcd_init_control(INIT_COMMAND); // Повторная отправка команды инициализации. lcd_init_control(INIT_COMMAND); // Задание режима отображения. lcd_init_control(DISPLAY_COMMAND); // Очистка экрана. lcd_init_control(CLEAR_COMMAND); // Выбор направления сдвига курсора и экрана. lcd_init_control(EMS_COMMAND); } // Записывает строку для отображения из памяти даных в ЖКИ-модуль. #pragma used+ void lcd_puts(char *str) { char c; #pragma warn- while (c = *str++) { #pragma warn+ lcd_putchar©; } } #pragma used- // Записывает строку для отображения из памяти программ в ЖКИ-модуль. #pragma used+ void lcd_putsf(char flash *str) { char c; #pragma warn- while (c = *str++) { #pragma warn+ lcd_putchar©; } } #pragma used- void main(void) { // Инициализация ЖКИ-модуля. lcd_init(); // Вывод заданного текста в первой строке с первого знакоместа. lcd_putsf(static_text); // Переключение на четвёртое знакоместо второй строки. lcd_control(DDRAM_COMMAND + SECOND_ROW + 3); // Вывод заданного текста во второй строке с четвёртого знакоместа. lcd_putsf(static_text); for (;;) { }
  7. Доброе время суток! Встала задача обработать сигнал (сейчас он регистрируется самописцем) АТМегой АВР, точнее для начала убрать "бороду" и выделить линейный сигнал. Амплитуда (размах) шума будет порядка 100-200 мВ, "горба" сигнала - где то 1 В. С отделением сигнала от шума практически не сталкивался. Подскажите, пожалуйста, каким образов лучше это сделать. Пока в голову приходит только из АЦП меги (последовательного приближения) внешней обвеской сделать АЦП с двойным интегрированием, второй вариан - цифровой фильтр... Вот что то на подобие входного сигнала (именно эта картинка рисована мышкой в пэинте).
  8. Большое спасибо. Только встречный вопрос :( Зачем резюки в цепи б-э транзисторов и резюки с кондером R21 VR2 C4??
  9. Спасибо. А можно расположение диодов (иль внешний вид сердца), а то чтот некоторые проги недо сек малость как выглядеть должны
  10. Для начала хотелось бы: 1. накапливающийся/спадающий огонь на большое кол-во СД 2. то же на небольшую группу СД 3. бегущий огонь с реверсом/без на небольшую группу СД 4. просто частое мерцание всех СД и т.п. Но это если МК, если нет_ то один пункт 2.
  11. Микроконтроллер конечно да (в принципе с AVR), но как тогда быть, ести сд штук 50 (спираль какая нить). Да и если делать все-таки "линейку" из 5-7 сд/групп сд, то МК по моему дороговато. Вообще хочу сделать сд сердце (либо пульсирующее, если на рассыпухе, либо с большим количеством программ, но тогда уже на МК что-то типа как тут http://www.youtube.com/watch?v=2O6mkFW-4Dg...;feature=share)
  12. Доброе время суток! Подскажите, пожалуйста, как сделать бегущий огонь на светодиодах (с реверсом и нет), но чтобы предыдущие включенные оставались включенными до включения последнего (во наплел). В принципе, как в индикаторе уровя.
  13. Подскажите, пожалуйста, как определить минимальное время между пусками двигателя 3дстр-135-1,6-150-у2. Двигатель в составе привода мэоф на затворы воды.
  14. :unsure: Подсккажите, пожалуйста, как определить время минимальное между поочередными пусками асинхронного двигателя (через магнитный пускатель)? Двигатели АИС56В4У3 и 3ДСТР-135-1.6-150-У2.
  15. Есть чутка литературы по планарным трансам, постмотрите там на русском и на англицком, по расчетам тож что то есть. Analysis_and_Design_Inter_WindingShielding_Structure.pdf planetrans.pdf proektirovanie_ot_Vaso.pdf Understanding_and_Optimizing_Electromagnetic_Compatibility.pdf ________________________.PDF
  16. Здравствуйте. Подскажите пожалуйста где можно найти модель lm2679 или друго преобразователя с током на 5А? на сайте производителя не нашел(
  17. Есть у кого-нибудь spice модели для Микрокапа импульсных преобразователей, или где можно найти их? Спасибо.
  18. Мучился, получил такую штуку, с этим драйвером, частота практически такая же. поставил идеальный транс 1:1. По поводу другого драйвера чтоб не было транзисторов не смотрел по причине жесткого тебования препа.
  19. :unsure:?? Да. заметил, исправил. Но всеравно не то: Во первых через транзистор нижнего плеча всеравно ток не течет (наверное как то не так нагрузка включена), Во вторых почему такое большое напряжение на затворе тр верхнего плеча, почти коммутируемое? Поэтому на питании 30 В (картинка) транзистор работает нормально, а если 300... только нижнее плечо отклывается (но ток то не течет!) Тогда нужно разобраться с самим трансформатором: какое напряжение питания (на первичной обмотке) брать для получения необходимой мощности и согласования сопротивления нагрузки, индуктивности обмоток, материал сердечника... и модель этого трансформатора в Микрокапе. Модели мосфетов и драйвера реальные (irf740) брал с сайта производителя. А чем плох драйвер ir2110?
  20. После генератора должен стоять триггер, а он делит частоту на 2, следовательно частота генератора 3,34МГц. И разве 555 на такой частоте будет работать?? Мне кажется лучше использовать генератор с кварцом, но на такую частоту нету, подскажите как выйти из этого положения. Попробовал частично собрать схему (без транса выходного) в Микрокапе на более низкой частоте. Нижнее плечо драйвера работает нормально, а вот с верхним проблемы, не могу толком разобраться с бутстрепной схемой управления. И еще, подскажите как подключить нагрузку в тестоаой схеме(везде по-разному подключают) и в реальной (с трансформатором с выводом нуля, на вывод нуля питание, другие конци обмоток насток и исток разных плеч, а Vs куда? :unsure: ). Скажите пожалуйста название книги или скинте на мыло [email protected] Спасибо за помощь.
  21. А могли бы Вы посоветовать какую литературу по рассчету, намотке вч трансформаторов, выборе сердечника.... Спасибо.
  22. А есть вариант сделать 2хканальный стабилизатор без трансформатора на этой микросхеме, или микросхемах такого типа?
  23. В принципе. с драйверами и транзисторами разобрался, а как выбрать трансформатор ВЧ? и согласовать с нагрузкой ~5 кОм?
×
×
  • Создать...