Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
Короче по пьяни решил сделать ампер-вольтметр на малоножечном пиике , взял его из ручного оповещателя от системы BOLID . 8 ног , две питание , одна mlcr ? остаётся 5 ... три ноги на передачу информации в 595-е регистры ( один на 8 сегментов восьмисегментных лед индикатрорв, второй на управление катодами их же). Другие два -АЦП на ток и напряжение . Ну вобщем врут АЦП как Троцкие ! В чём дело ? В бабине или в кабине ?
|
||
Оценка
|
has a little shameless behaviour in the past
Регистрация: 13.02.2019
Сообщений: 757
Репутация: -30
|
Цитата:
Короче по пьяни решил сделать ампер-вольтметр на малоножечном пиике , взял его из ручного оповещателя от системы BOLID . 8 ног , две питание , одна mlcr ? остаётся 5 ... три ноги на передачу информации в 595-е регистры ( один на 8 сегментов восьмисегментных лед индикатрорв, второй на управление катодами их же). Другие два -АЦП на ток и напряжение . Ну вобщем врут АЦП как Троцкие ! В чём дело ? В бабине или в кабине ?
Скорее любимая белка привёвшая к контроллеру песца . |
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
Среда разработки CCS, прога написана на с++ , функция read_adc() как я лично думаю учитывает все тайминги ... На входе ацп стоит конденсатор на 0.1 мф, программа суммирует 100 показаний ацп, потом делит их на 100 , и тогда выводит .Возможна проблема быть в печатной плате ?
|
||
Оценка
|
Эксперт
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 641
|
не факт... надо смотреть код.
выходное сопротивление источника напряжения(делителя или че там у вас) сколько? нормам ДШ соответствует? вполне. |
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
#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 } } } |
||
Оценка
|
Эксперт
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 641
|
1. не работал с CCS , поэтому не знаю как правильно в нем настраивается осцилятор, предположу что настроен на 8МГц(даже если дефолтная 4МГц) , тактовая АЦП настроена не правильно, делитель должен быть 16.
2. есть большие сомнения что здесь set_adc_channel(1); есть нужные тайминги ЗЫ и алекс если выкладываете код пользуйтесь тегами [CОDE][/CОDE] кнопка # панели сообщений, его же читать не возможно |
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
Код:
#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 } } } |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |