Доброго всем времени суток! Очень нужна ваша помощь. С пиками работаю впервые да и вообще такую задачу решаю впервые. Есть данный контроллер ножки 3,7,8,9,10,11,12,13 сделаны как входы аналогового сигнала (на выводах 3,5В) от светодиодов. На каждую ножку подведено 2 светодиода. Задача состоит в том, что бы определить высокий уровень на данных входах, что бы сделать определенное действие. Небольшое исследование - закоротив 4 светодиода получили на всех входах 4.1В.
Доброго всем времени суток! Очень нужна ваша помощь. С пиками работаю впервые да и вообще такую задачу решаю впервые. Есть данный контроллер ножки 3,7,8,9,10,11,12,13 сделаны как входы аналогового сигнала (на выводах 3,5В) от светодиодов. На каждую ножку подведено 2 светодиода. Задача состоит в том, что бы определить высокий уровень на данных входах, что бы сделать определенное действие. Небольшое исследование - закоротив 4 светодиода получили на всех входах 4.1В.
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Да, я понял что с ADC работа. План действий таков:
1) Устанавливаю выводы как аналоговые входы 2) Через АЦП меряю какое напряжение и сравниваю его с нужным пределом.
Просто не знал что в пиках любой порт можно перевести как аналоговый, думал что с аналоговыми сигналами работает только порт A АЦП.
Буду благодарен в помощи настройки таймера. Даже в даташите не понимаю..
необходимо сформировать одиночный прямоугольный сигнал на ноге А5. При подаче питания высокий уровень длительностью 75мс, затем низкий уровень длительностью 25мс.
По таймеру: Как вариант, настройте TMR2 на 1mS и считайте время программно по прерыванию с TMR2. Для настройки таймера надо знать частоту FOSC. ---- P.S. А pdf на PIC16F1503, всё-таки, читать придётся...
Насчет "Контроллер очень непростой" вероятно имелось ввиду, что для начала не помешало бы с обычными "среднемладшими" познакомиться, затем 18-ю серию проштудировать - а потом уже к этой разновидности приступать.
..для начала не помешало бы с обычными "среднемладшими"...
Как замечательно сказал. Даже если не применять всего что заложено (типа конфигурируемых логических ячеек или цифрового генератора), необходимо правильно сконфигурировать его, а для этого читать доки. Другого пути нет. Там немного в основном ДШ - 340 страниц.
_________________ Лучше умному тупить, чем тупому умничать
// Все порты С входы TRISCbits.TRISC0 = 1; // RC0 =привет пишем комент на русском TRISCbits.TRISC1 = 1; // RC1 = TRISCbits.TRISC2 = 1; // RC2 = TRISCbits.TRISC3 = 1; // RC3 = TRISCbits.TRISC4 = 0; TRISCbits.TRISC5 = 0;
PORTC = 0x00; //На всех входах 0
ANSELC = 0x0F; // С0 - С3 аналоговые
// Выбираем канал внутренего опорного напряжения //Бит - 7 - Не используется, читается как 0 //Бит - 6-2- Выбор канала (11111 внутрение опорное напряжение) //Бит 1- 1 - статус преобразования //Бит 0 - 0 - включение преобразования /// работаем с первым каналом
ADCON0 = 0b00000000; ADCON1 = 0xb01110000;
ADCON0bits.ADON = 1; __delay_us(5); ADCON0bits.GO = 1; while (ADCON0bits.GO); { result = ((ADRESH * 205) + ADRESL); }
if (result >= 4) { countChanel++; }
__delay_us(5); // Второй канал ADCON0 = 0b00000100; ADCON0bits.ADON = 1; __delay_us(5); ADCON0bits.GO = 1; while (ADCON0bits.GO); { result = ((ADRESH * 205) + ADRESL); } if (result >= 4) { countChanel++; }
__delay_us(5); // 3 канал ADCON0 = 0b00001000; ADCON0bits.ADON = 1; __delay_us(5); ADCON0bits.GO = 1; while (ADCON0bits.GO); { result = ((ADRESH * 205) + ADRESL); } if (result >= 4) { countChanel++; }
__delay_us(5); //Работаем с 4 каналом ADCON0 = 0b00010000; ADCON0bits.ADON = 1; __delay_us(5); ADCON0bits.GO = 1; while (ADCON0bits.GO); { result = ((ADRESH * 205) + ADRESL); } if (result >= 4) { countChanel++; }
__delay_us(5); // 5 канал ADCON0 = 0b00010100; ADCON0bits.ADON = 1; __delay_us(5); ADCON0bits.GO = 1; while (ADCON0bits.GO); { result = ((ADRESH * 205) + ADRESL); } if (result >= 4) { countChanel++; }
__delay_us(5); // 6 канал ADCON0 = 0b00011000; ADCON0bits.ADON = 1; __delay_us(5); ADCON0bits.GO = 1; while (ADCON0bits.GO); { result = ((ADRESH * 205) + ADRESL); } if (result >= 4) { countChanel++; }
__delay_us(5); // Седьмой канал ADCON0 = 0b00011100; ADCON0bits.ADON = 1; __delay_us(5); ADCON0bits.GO = 1; while (ADCON0bits.GO); { result = ((ADRESH * 205) + ADRESL); } if (result >= 4) { countChanel++; }
if (countChanel <= 2 ) { PORTA = 0x20; // Порт A5 устанавливаем 1. mydelay_ms(87); PORTA = 0; // Порт A5 устанавливаем 1. mydelay_ms(25); PORTA = 0x20; // Порт A5 устанавливаем 1. }
while(1) {
}
}
суть кода: анализирую напряжение на каналах, если напряжение больше 4 вольт то прибавляю счетчик. В итоге если счетчик меньше 2, то генерирую одиночный импульс. Правильно ли я перевожу полученные значения регистров в вольты. Небходимо с точностью хотя бы 1 знак после запятой..
Только предварительно через #define Vdd_mV определите напряжение питания в мВ. А откуда вы взяли 205 я так и не понял.
Для расчета удобно было бы подать напряжение питания 5.12 В, тогда result_v = 5 * result_adc - готовый результат в мВ. Можно еще сделать привязку Vdd через внутреннее опорное 1.024 В, тогда еще с формулами поколдовать придется. В общем, варианты разные.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Куда выводите результат? В смысле устройство отображения имеется? Если есть возможность, для начала выводите голые значения result_adc для каждого канала, чтобы оценить правильность измерений. А дальше видно будет.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
if (countChanel >= 2 ) { PORTA = 0x20; // Порт A5 устанавливаем 1. mydelay_ms(87); PORTA = 0; // Порт A5 устанавливаем 1. mydelay_ms(25); PORTA = 0x20; // Порт A5 устанавливаем 1. }
в итоге условие выполняется при countChanel = 7. А это значит что выполняется условие if (ADC >= 4700) { countChanel++; } для каждого канала
Добавлено after 19 minutes 53 seconds: в изначальной функции unsigned int calc_v(void) { unsigned int result_adc; unsigned long result_v;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения