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

crazz

Рекомендуемые сообщения

СОМ порт компьютера работает с напряжениями -10 и +10 вольт. Микроконтроллеру это не подходит, я бы сказал вредно. Кроме того при программировании на MCLR нужно 12...14 вольт...

Так, что я бы посоветовал подобрать другую схему. Поищите на этом сайте программаторы или программаторы СОМ 

Ссылка на комментарий
Поделиться на другие сайты

Только что, Влад Иванович сказал:

СОМ порт компьютера работает с напряжениями -10 и +10 вольт. Микроконтроллеру это не подходит, я бы сказал вредно. Кроме того при программировании на MCLR нужно 12...14 вольт...

Так, что я бы посоветовал подобрать другую схему. Поищите на этом сайте программаторы или программаторы СОМ 

на тот программатор питание идет не с Com порта а цепляется отдельно, с этим проблем нет.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

5 минут назад, Влад Иванович сказал:

Boris68, Вы пользовались этим программатором?

На схеме с 3 ноги DB9 через резистор на 1 пин МК?

Только учусь, до этого не пользовался. 

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Суть-то у него одна и та же.

Проблема таких программаторов в том что они напрочь не работают через USB-COM переходники(там нарушается тайминг из-за особенностей работы USB-шины). Надеюсь, ты подключаешь его к полноценному аппаратному порту?

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Вопрос наверное 100 раз обсуждался, но все же. Частотомер.

Все бы хорошо, но мне еще нужен и вольтметр. Решил делать на pic16f72 (просто он у меня есть)

Частоту решил измерять при помощи TMR1. Время измерения 1с.

Что меня смущает - так это измерение и отображение напряжения раз в 1с, но как ускориться - ума не приложу :(

Любой лишний код в прерывании добавляет ошибок в измерение. Тем более такой большой код вывода на дисплей.

Может кто что подскажет?

В железе код не проверял, только в протеусе.

Скрытый текст



// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

unsigned int v = 0;
unsigned int Owerflow = 0;
unsigned long Fr;
int Tick;
int btn = 2;

char *freq = "U:0.0 F:000.000Hz";
unsigned char T0; // переменные для Timer0.

void Display_Freq(unsigned long freq2write, int v ) {
    freq[0] = 85; //U
    freq[1] = 58; // :
    freq[2] = (v/10)%10 + 48;
    freq[3] = 46;
    freq[4] = v%10 + 48;

    freq[5] = 152;
    freq[6] = 70; // F
    freq[7] = 58; // :

    freq[8] = (freq2write/100000)%10 + 48;
    freq[9] = (freq2write/10000)%10 + 48;
    freq[10] = (freq2write/1000)%10 + 48;
    freq[11] = 46;
    freq[12] = (freq2write/100)%10 + 48;
    freq[13] = (freq2write/10)%10 + 48;
    freq[14] =  freq2write%10     + 48;

    Lcd_Out(1, 1, freq);
}

// обработка прерываний
void interrupt (){

     if( T0IF_bit ){
         T0IF_bit = 0;
         TMR0 = T0;
         
         Tick++;
         
         //задержка опроса кнопки ~100ms
         if( (Tick/4)%10 == 0 ){

             if( RC2_bit == 0 ){

                 PORTA = 0x00;
                 btn = btn << 1;
                 if( btn > 16 ){
                     btn = 2;
                 }
                 PORTA = btn;

             }

         }
         
     }

     if( TMR1IF_bit ){
         TMR1IF_bit = 0;
         Owerflow++;
     }

}

void main() {

      PORTA = 0b00000010;
      PORTB = 0b00000000;
      PORTC = 0b00000000;
      
      TRISA = 0b00000001;
      TRISB = 0b00000000;
      TRISC = 0b00011111;

      ADCON0 = 0b00000000;

      // Timer0 выключен. Включатся в основном цикле
      // предделитель 1:8.
      OPTION_REG = 0x86;
      T0 = 61; // тикаем 24.96ms

      Lcd_Init();
      Lcd_Cmd( _LCD_CLEAR);
      Lcd_Cmd( _LCD_CURSOR_OFF );

      // Timer1.
      T1CON = 0x0E;

      // разрешаем прерывания
      GIE_bit = 1;


      while(1){

          // обнуляем переполнение
          Tick = 0;
          Owerflow = 0;
          
          // читаем напряжение
          v = ADC_Read( 0 );
          v = ( 500 * v ) >> 8;
          v = ( v + 5 )/10;
          Display_Freq( Fr, v );

          // подготавливаем таймер
          TMR1H = 0;
          TMR1L = 0;
          TMR1IF_bit = 0;
          
          // таймер на 25ms
          TMR0 = T0;
          TMR0IF_bit = 0;
          TMR0IE_bit = 1;

          // включаем захват
          TMR1ON_bit = 1;

          // ждем 1сек.
          //Delay_ms(1000);
          while( Tick != 40);

          // выключем захват
          TMR1ON_bit = 0;
          TMR0IE_bit = 0;
          
          // читаем состояние таймера
          Fr = (unsigned long)( TMR1H << 8 ) + TMR1L;
          Fr = 65536 * Owerflow + Fr; // учитываем переполнения

          Display_Freq( Fr, v );

      }

}


 

 

Изменено пользователем vksam
Ссылка на комментарий
Поделиться на другие сайты

Грабли-грабли-грабли... Чтобы ускорить измерение надо измерять период сигнала, потом высчитывать по нему частоту. А чтобы измерить достаточно высокую частоту - измеряйте время, за которое накопится например 1000 импульсов. Есть ещё расширители импульсов...

А вообще не заморачивайтесь, всё сделано до вас...

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

@2jas я ничего не делю. Из TMR1 получаю частоту. TMR0 - отсчитываю 25ms.

@Alexeyslav Т.е. измерять время одного периода? С периодом для 1гц. все равно секунда получается. 

И для этого алгоритма понадобится очень точный отсчет времени.

 

Расширитель - это уже круто.

На самом деле мне нужен простой частотомер. Всего до 200Кгц.

 

Что придумано до нас?

Ссылка на комментарий
Поделиться на другие сайты

Ссылка на комментарий
Поделиться на другие сайты

Конечно секунда измерения. А вам именно такие частоты надо измерять? С какой точностью? Обычный резонатор, вставленный в схему абы как с неизвестными характеристиками в лучшем случае обеспечит 4 знака точности, если повезёт - 5 знаков.

На этом же форуме была тема по нормальному частотомеру исползующему ПЛИС и кварцевый генератор с мобильного телефона(там обеспечивает точность 7 знаков - обычно это с головой).

У счетного частотомера ещё проблема имеется - последний разряд будет гулять в зависимости от того на какую фазу попадает окончание счета. В том же частотомере всегда учитывается целое количество периодов измеряемой частоты, но расплата за это - относительная сложность конструкции(контроллер + ПЛИС + высокоточный генератор).

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

@Владимир Белов давайте будем честными, в поиске практически нет результатов с нужным контроллером. Вариант "купи нужный" - даже не рассматривается.

Я перелопатил очень много разных схем и решений, но есть нюансы:

1. частотомер мне нужен для генератора НЧ. Пределы - до 200КГц. До 999Гц точность 0,5. После 1КГц - точность 1Гц.

2. я ограничен корпусом и не все схемы удобно развести на печатке. В своем решении могу задействовать нужные порты/биты с "удобной" стороны корпуса контроллера.

3. нужен вольтметр выходного сигнала до 10В с точностью 0,2В. 

3.1 возможно добавить информацию о пределах выходного сигнала(один из четырех).

4. может, я конечно и зануда, но меня жутко бесят перегруженные конструкции. Лишние слова на дисплее, функции и т.д.

 

Так что наверное буду переписывать на измерение длительности периода. По идее с повышением измеряемой частоты время измерения будет уменьшаться.

Ну с миганием последнего символа надо пробовать. Но мысли такие - ждать нижний уровень, как только высокий - запускать отсчет времени, ждать высокий, ждать низкий, как только высокий фронт - выключать таймер.  По идее так можно получить длину одного периода.

И тут все упрется в точность измерения временных интервалов.

В общем надо пробовать... 

Изменено пользователем vksam
Ссылка на комментарий
Поделиться на другие сайты

46 минут назад, vksam сказал:

частотомер мне нужен для генератора НЧ. Пределы - до 200КГц. До 999Гц точность 0,5. После 1КГц - точность 1Гц.

при таком диапазоне вам придется измерять период (от фронта до фронта например) внизу диапазона и пересчитывать его в частоту,

и начиная с некоторой частоты надо измерять частоту (количество фронтов за период - чем выше период тем выше точность). А программа кажется написана чтобы измерять частоту!

Например частоту 500Гц можно померить за 1/500 секунды измерив период, а посчитайте соответственно сколько будет фронтов для 200 кГц за ту же 1/500 секунды, 100 кажется, если в единицах частоты процессора это значение меньше - значит точность меньше при измерении периода! Как то так!

Период измерения определяет что мерить - частоту или период.

Я хотел показать как все не просто  в общем, вроде получилось :) .

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

На самом деле надо измерять И длительность, И частоту. Например - набралось скажем 500 импульсов за 0.5сек - останавливаем счет и фиксируем время. Если наоборот, импульсов мало но вышло время - ждем окончания импульса и фиксируем время. Дальше - просто делим импульсы на время и получаем частоту. Хотя, банальным счетом конечно проще будет.

Если вас к примеру устроит что частота будет измеряться 2 секунды, то решить проблему с вольтметром довольно просто - пусть он работает со своей частотой, а временной интервал частотомера определить таймером и в обработчике таймера зафиксировать частоту и поместить её в промежуточную ячейку памяти, которую потом подхватит код вольтметра и выведет обе величины - и частоту и напряжение.

Но вот ИМХО я бы задачу такую решал бы не на PIC-е, для него это уже высший пилотаж. А взял бы или что-то вроде ATMEGA328 или из серии STM32F103 - цена та же, но периферия особенно в области таймеров позволит сделать наверно несколько частотометров(при желании) параллельных на одном кристалле. Но изучать его... хотя, было бы желание - есть АРДУИНО-платка на основе STM32F103.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Если стоит задача измерения  напряжения с частотой 200 кГц, то ни младшие ПИКи, ни уж тем более Мега (у нее АЦП еще медленнее, чем у младших ПИКов) тут не прокатят.

Прокатят практически любые ARM-ы, включая STM32F0, 16-разрядные ПИКи (PIC24H/PIC24E/dsPIC33F/dsPIC33E), TMS320  и т.п.

А вот измерять частоту смогут и ПИКи и АВР примерно с одинаковым успехом. Для этого нужен не просто таймер, а модуль Input Capture, а диапазоны частот легко переключаются предделителем этого модуля. Таким образом по сути реализуется простейший reciprocal counting :  http://caxapa.ru/thumbs/331080/paper67.pdf

Причем, если имеется частота измеряемого синусоидального сигнала, можно измерить амплитуду синуса посредством всего двух квадратурных отсчетов за период БЕЗ СИНХРОНИЗАЦИИ с измеряемым сигналом.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Да я не думаю что там все так плохо, измерить амплитуду выходного сигнала генератора можно и без измерения каждого отсчета, нужен всего лишь амплитудный детектор или детектор максимума, а там измеряй напряжение на его выходе хоть секунду. С частотами меньше 10гц правда будут определённые трудности, несмотря на метод измерения...

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

мда... печаль печальная.

При измерении периода все хорошо, но после 50Гц

До этого происходит переполнение Timer1. Отлавливать переполнение не получается :(

Уже подумываю использовать два контроллера. Один для частотомера, второй для вольтметра.

Вот только как это на один дисплей вывести?

по I2C? или можно обеими контроллерами выставлять данные на одну шину?

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, vksam сказал:

Отлавливать переполнение не получается :(

Вы знакомы с прерываниями?

Что конкретно у Вас не получается?

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Прерываниями ловить переполнение таймера это не очень хороший вариант - если надо будет "снять" значение счетчика в момент незадолго после переполнения будут проблемы. Выразится это в том что у частотомера будет небольшое слепое пятно в районе 50Гц, а потом и 25, и....

А предделитель таймера нельзя включить, расширив пределы измерения? извлечь значение с предделителя можно будет потом методом контролируемого досчета.

Два контроллера на один дисплей - легко: один контроллер пусть дисплеем занимается и напряжение измеряет, а второй будет частотомером и сообщать первому что надо отобразить на дисплее. Но более правильным, конечно, будет использование другого контроллера с 16 и даже 32-битными счетчиками с модулями захвата.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Alexeyslav сказал:

у частотомера будет небольшое слепое пятно в районе 50Гц

С какого перепуга?

Любой неаппаратный счет ведет к погрешностям латентности. Но эти ситуации легко обрабатываются в тех же самых прерываниях. То есть при срабатывании внешнего прерывания, при чтении счетчика проверяется флаг таймера, а при переполнении флаг входного прерывания. Если выбран МК без модуля CCP, то ничего другого и не остается.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Такое решение добавит лишь один бит, и перенесёт проблему на 25Гц. А если считать переполнения таймера, то тут становится сложнее - пока обработчик прерывания отработает мы никак не можем зафиксировать значение таймера, а это значит что несколько отсчетов после каждого переполнения никогда не будут давать какой-либо результат, это и будет дыркой в измеряемых частотах. и судя по всему это будет в районе 50, 25, 12.5 и т.д. герц.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Какой один бит?  Любое количество переполнений будет посчитано.

Это решение просто уменьшает латентность. И все. Ясен перец, что его нужно применять при включенных предделителях таймера. То есть когда нет иного выбора. Старшее значение предделителя  и перекрестная обработка событий в прерывании практически сводит ошибку латентности к нулю.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

@my504 Да, я именно с CCP и пытаюсь разобраться. Но не удачно.

@Alexeyslav так у 16F72  TMR1 на 16 бит и модуль CCP

И уж простите, но ваши объяснения не сильно понятны в секции для начинающих

Скрытый текст

 


void interrupt (){

          if( TMR1IF_bit == 1){
            TMR1IF_bit = 0;
            TMR1H = 0x00;
            TMR1L = 0x00;
            // считаем переполнение
            Overflow ++;
          }

}

void main() {

      PORTA = 0b00000000;
      PORTB = 0b00000000;
      PORTC = 0b00000000;
      
      TRISA = 0b00000001;
      TRISB = 0b00000000;
      TRISC = 0b00011111;

      ADCON0 = 0b00000000;


      CCP1IE_bit = 1;   // CCP1 interrupt enabled
      CCP1IF_bit = 1;
      
      CCP1CON = 0x05;        // 00000101; захват каждого фронта
      CCPR1=0x00;
      
      T1CON=0x01;  	// 1:1
      TMR1IE_bit = 1;

      GIE_bit = 1;
      PEIE_bit = 1;

      while(1){

          while(!CCP1IF_bit);
          data1=CCPR1;	
          CCP1IF_bit=0;
          while(!CCP1IF_bit);
          data2=CCPR1;
          CCP1IF_bit=0;

          if(data1<data2){

              Fr = (data2 - data1) + 65536*Overflow;
              Fr = (1000000)/Fr;

              Overflow = 0;

          }


      }

}

 

 

 

 

 

Изменено пользователем vksam
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...