Миграция проектов на ПЛИС новых производителей

PIC12F683 плюс два регистра сдвига 595. Проблема с АЦП

Страница 1 из 5
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
21.02.2019 23:07 #1
Короче по пьяни решил сделать ампер-вольтметр на малоножечном пиике , взял его из ручного оповещателя от системы BOLID . 8 ног , две питание , одна mlcr ? остаётся 5 ... три ноги на передачу информации в 595-е регистры ( один на 8 сегментов восьмисегментных лед индикатрорв, второй на управление катодами их же). Другие два -АЦП на ток и напряжение . Ну вобщем врут АЦП как Троцкие ! В чём дело ? В бабине или в кабине ?
Оценка
has a little shameless behaviour in the past
 
Регистрация: 13.02.2019
Сообщений: 757
Репутация: -30
65 83
81 0
 
22.02.2019 20:57 #2
Цитата:
Сообщение от aalex_641
Короче по пьяни решил сделать ампер-вольтметр на малоножечном пиике , взял его из ручного оповещателя от системы BOLID . 8 ног , две питание , одна mlcr ? остаётся 5 ... три ноги на передачу информации в 595-е регистры ( один на 8 сегментов восьмисегментных лед индикатрорв, второй на управление катодами их же). Другие два -АЦП на ток и напряжение . Ну вобщем врут АЦП как Троцкие ! В чём дело ? В бабине или в кабине ?
Почему сразу - дичь ?
Скорее любимая белка привёвшая к контроллеру песца .
Оценка
Опубликованы материалы вебинара, посвященного пленочным конденсаторам компании Hongfa, на котором была представлена текущая линейка и модельный ряд продукции этого направления, включая новые, недавно вышедшие серии. На вебинаре были приведены актуальные примеры применения пленочных конденсаторов Hongfa в источниках питания, зарядных станциях для электротранспорта, преобразователях частоты, фотоэлектрических преобразователях и ветрогенераторах.
Эксперт
 
Аватар для DmitriyVDN
 
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 639
619 131
34 9
 
22.02.2019 21:25 #3
Цитата:
Сообщение от aalex_641
-АЦП на ток и напряжение . Ну вобщем врут АЦП как Троцкие !
требования к работе АЦП все выполнены? тайминги все соблюдаются? цифровой фильтр данных сделан?
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
22.02.2019 23:22 #4
Цитата:
Сообщение от DmitriyVDN
требования к работе АЦП все выполнены? тайминги все соблюдаются? цифровой фильтр данных сделан?
Среда разработки CCS, прога написана на с++ , функция read_adc() как я лично думаю учитывает все тайминги ... На входе ацп стоит конденсатор на 0.1 мф, программа суммирует 100 показаний ацп, потом делит их на 100 , и тогда выводит .Возможна проблема быть в печатной плате ?
Оценка
Эксперт
 
Аватар для DmitriyVDN
 
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 639
619 131
34 9
 
23.02.2019 00:25 #5
Цитата:
Сообщение от aalex_641
функция read_adc() как я лично думаю учитывает все тайминги ...
не факт... надо смотреть код.
Цитата:
Сообщение от aalex_641
На входе ацп стоит конденсатор на 0.1 мф
выходное сопротивление источника напряжения(делителя или че там у вас) сколько? нормам ДШ соответствует?

Цитата:
Сообщение от aalex_641
Возможна проблема быть в печатной плате ?
вполне.
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
23.02.2019 01:14 #6
код не является коммерческой тайной )) И вообще никакой )))
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
23.02.2019 01:15 #7
#include <12F683.h>
#device ADC=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#use delay(internal=8000000)
#use FIXED_IO( A_outputs=PIN_A5,PIN_A4,PIN_A2 )

#define DS PIN_A5 // пин для вывода данных на 595 регистры
#define CH_CP PIN_A2 // пин захвата данных
#define ST_CP PIN_A4 // пин защёлка (разрешение индикации)
unsigned int16 vol=0,cur=180; //vol-напряжение, cur-ток
unsigned int32 vol1,cur1;
unsigned char glob_array[6]={235,235,235,235,235,235}; //массив для выводимых цифр вводим образы нулей
const unsigned char digit[10]={235,130,103,199,142,205,237,131,239,207} ; // образы цифр 0-9 -
unsigned char sh;
#INT_TIMER1
void TIMER1_isr(void)
{
//прерывание пока не используем пока
}

void zapmass ( int16 a,int16 c, unsigned char b) //Заполнение массива образами цифр а-трёхзначное число, b-номер старшего разряда В МАССИВЕ
{ //с -максимальное значение после которого выводим прочерки

if (a<c)
{
glob_array[b]=digit[a/100]; //старший разряд
glob_array[b+1]=digit[(a%100)/10]; //средний
glob_array[b+2]=digit[a%10]; //младший
}


else// Если показания выходят за заданные рамки то вывести прочерки во все сегменты
{
glob_array[b]=glob_array[b+1]=glob_array[b+2]=4; //4-это прочерки

}
}
void main()
{
setup_adc_ports(sAN0|sAN1);
setup_adc(ADC_CLOCK_DIV_64|VSS_VDD);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

disable_interrupts(INT_TIMER1); //прерывания по таймеру ненужны пока
// enable_interrupts(INT_TIMER1);
disable_interrupts(GLOBAL);
//enable_interrupts(GLOBAL);

while(TRUE)
{

unsigned char i,j;
unsigned char y=64; // 01000000 //номер катода (включенного индикатора)

for (j=0;j<6;j++) //вывод 6-ти цифр в индикаторы
{

for (i=0;i<8;i++)//8 байт в регистры (образ цифры) вторая микросхема
{
if ((glob_array[j]>>(i))&1) output_high(DS); else output_low(DS);// побитно вводим информацию в микросхему
output_high(CH_CP);// захват данных разрешаем
output_low(CH_CP); // завершаем захват
}
for (i=0;i<8;i++) //8 байт в регистры (номер индикатора который надо зажечь в данный момент ) первая микросхема
{
if ((y>>(i))&1) output_high(DS); else output_low(DS);// побитно вводим информацию в микросхему про "y" ниже...
output_high(CH_CP); // захват данных разрешаем
output_low(CH_CP); // завершаем захват
}
y=y>>1; //эта переменная определяет какой индикатор зажечь, изначально в ней 01000000 потом 6 раз сдвигается в право меняя очерёдность
output_high(ST_CP); //выводим данные на индикаторы (защёлкиваем защёлку )

// setup_adc_ports(sAN0); // 0 канал мультиплексора для АЦП
// set_adc_channel(0); // незнаю зачем это делать так видел в инете
// cur1=cur1+read_adc(); // считываем АЦП с токового канала



setup_adc_ports(sAN1); // 1 канал мультиплексора для АЦП
set_adc_channel(1);
// vol1=vol1+read_adc();
vol=read_adc()/10;
// delay_ms(30);
/* if (sh==100) // sh-счётчик ста измерений
{
sh=0;
vol=vol1/1000;
cur=cur1/1000;
vol1=0;
cur1=0;
}
sh++; */
zapmass (vol,999,0);
// zapmass (cur,500,3); // заполняем массив glob_array с 3 по 5 цифрами
glob_array[1] |= (1 << 4); // добавляем запятую в показания напряжения
glob_array[3] |= (1 << 4); //добавляем запятую в показания тока

output_low(ST_CP); // отключить вывод на индикаторы на время ввода информации в регистры 74HC595
}
}

}
Оценка
Эксперт
 
Аватар для DmitriyVDN
 
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 639
619 131
34 9
 
23.02.2019 14:04 #8
1. не работал с CCS , поэтому не знаю как правильно в нем настраивается осцилятор, предположу что настроен на 8МГц(даже если дефолтная 4МГц) , тактовая АЦП настроена не правильно, делитель должен быть 16.
2. есть большие сомнения что здесь set_adc_channel(1); есть нужные тайминги
ЗЫ и алекс если выкладываете код пользуйтесь тегами [CОDE][/CОDE]
кнопка # панели сообщений, его же читать не возможно
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
24.02.2019 17:50 #9
Код:
#include <12F683.h>
#device ADC=16
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#use delay(internal=8000000)
#use FIXED_IO( A_outputs=PIN_A5,PIN_A4,PIN_A2 )

#define DS PIN_A5     // пин для вывода данных на 595 регистры
#define CH_CP PIN_A2  // пин захвата данных
#define ST_CP PIN_A4  // пин защёлка (разрешение индикации)
unsigned int16 vol=0,cur=180;  //vol-напряжение, cur-ток
unsigned int32 vol1,cur1;
unsigned char glob_array[6]={235,235,235,235,235,235}; //массив для выводимых цифр вводим образы нулей
const unsigned char digit[10]={235,130,103,199,142,205,237,131,239,207} ; // образы цифр 0-9 -
unsigned char sh;
#INT_TIMER1 
void  TIMER1_isr(void) 
{
   //прерывание пока не используем пока
 }
    
    void zapmass (  int16 a,int16 c, unsigned char b)  //Заполнение массива образами цифр а-трёхзначное число, b-номер старшего разряда В МАССИВЕ
    {                                                   //с -максимальное значение после которого выводим прочерки 

    if (a<c)
   {
     glob_array[b]=digit[a/1000];         //старший разряд
     glob_array[b+1]=digit[(a%1000)/100];  //средний
     glob_array[b+2]=digit[a%100/10];        //младший
    }   
    

    else// Если показания выходят за заданные рамки то вывести прочерки во все индикатроы
    {
    glob_array[b]=glob_array[b+1]=glob_array[b+2]=4;   //4-это прочерки
    
    }
}
void main()
{
   setup_adc_ports(sAN0|sAN1);
   setup_adc(ADC_CLOCK_DIV_64|VSS_VDD);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);      

   disable_interrupts(INT_TIMER1); //прерывания по таймеру ненужны пока
  // enable_interrupts(INT_TIMER1);
   disable_interrupts(GLOBAL);     //и вообще ненужны все
   //enable_interrupts(GLOBAL);   
   
   while(TRUE)
   {

 unsigned char i,j;   // вспомогательные переменные для циклов
 unsigned char y=64; // 01000000  //номер катода (включенного индикатора)
        
         for (j=0;j<6;j++) //вывод 6-ти цифр в индикаторы в режиме динамической индикации
          {
                         
                              for (i=0;i<8;i++)//8 байт в регистры (образ цифры) вторая микросхема
                           {
                                 if ((glob_array[j]>>(i))&1) output_high(DS); else output_low(DS);// побитно вводим информацию в микросхему
                                 output_high(CH_CP);// захват данных разрешаем
                                 output_low(CH_CP);       //  завершаем захват
                           }
                  for (i=0;i<8;i++)  //8 байт в регистры (номер индикатора который надо зажечь в данный момент ) первая микросхема
                          {
                                if ((y>>(i))&1) output_high(DS); else output_low(DS);// побитно вводим информацию в микросхему про "y" ниже...
                                 output_high(CH_CP);      // захват данных разрешаем
                                 output_low(CH_CP);       //  завершаем захват                                 
                          }
                             y=y>>1; //эта переменная определяет какой индикатор зажечь, изначально в ней 01000000 потом 6 раз сдвигается в право меняя очерёдность
                              output_high(ST_CP);  //выводим данные на индикаторы (защёлкиваем защёлку :)  )
                                                 
                     setup_adc_ports(sAN1);   // 1 канал мультиплексора для АЦП
                       set_adc_channel(1);                          
                         vol1=vol1+read_adc();
                           //   delay_ms(30);
                              if (sh==100)   // sh-счётчик ста измерений
                              {
                               sh=0;
                               vol=vol1/100; //высчитываем среднее арифметическое
                               vol1=0;
                              }
                              sh++; 
                              zapmass (vol,1023,0); 
                               glob_array[1] |= (1 << 4); // добавляем запятую в показания напряжения
                                glob_array[3] |= (1 << 4); //добавляем запятую в показания тока  
    
                              output_low(ST_CP); // отключить вывод на индикаторы на время ввода информации в  регистры 74HC595
          }
   }

}
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
24.02.2019 19:02 #10
Убрал всё лишнее связанное с током. Оставил пока только напряжение. Схемы индикаторов не стал рисовать, потому как они работает как часы... Проблема только с АЦП.
Изображения
Тип файла: jpg 595.jpg (53.3 Кб, 0 просмотров)
Оценка
Ответ
Страница 1 из 5
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Оценка этой теме
Оценка этой теме:
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Скидки 15%, кэшбэк 15% и бесплатная доставка от ТМ Электроникс
Часовой пояс GMT +3, время: 13:18.
Обратная связь РадиоЛоцман Вверх