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

Помогите Разобраться С Работой Ацп Pic16F676


denkop

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

Контроллерами занимаюсь относительно недавно, собираю вольтметр. Вот схема:

post-172770-0-40493500-1373464348_thumb.jpg

Вот код:

#include <htc.h>
#include "pic.h"
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
#include "lcd.h"

__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & RCIO & INTOSCIO);
//

void main() {
TRISA=0b00000001;
TRISC=0;
PORTA=0;
PORTC=0;
CMCON=0x07;
ANSEL=0b00000001;
ADCON0=0b10000001;
ADCON1=0b01100000;
int h_adc, l_adc;
unsigned char v;
lcd_init();
lcd_goto(0);
lcd_puts("U=");
__delay_ms(100);
GODONE=1;
while (GODONE) {}
l_adc=ADRESL;
h_adc=ADRESH;
v=l_adc+h_adc*256;
lcd_puts(v);
//lcd_goto(0x40);
//lcd_puts("I=0.00");

for(;;

}

Доходит до цикла ожидания конца преобразования и ждёт до бесконечности... В протеусе есть два варнинга:

post-172770-0-73869700-1373464727_thumb.jpg

Судя по всему проблема с делителем, перепробовал все варианты от F/2 до F/64. Никаких изменений(..

Милион раз скурил даташит по теме ADC, просмотрел кучу похожих примеров, с виду всё сделано как в примерах, в соответствии с предписаниями даташита, но всё равно не работает.

в чём проблема не пойму((...

Помогите пож, люди добрые, разобраться в чём проблема!

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & RCIO & INTOSCIO);

два разных генератора? или нет?

сорь, тут глупость, это последний вариант, изначально стоял & INTOSCIO.. на проблему никак не повлияло

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

Если программа пишется под симулятор, то его надо ковырять. Я рекомендую делать в железе, лично для меня так проще. Не надо еще с глюками протеуса бороться. Я бы эту строку написал бы так

while(GODONE);

не выбран канал, аналоговый, в ADCON0

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

в протезе, в настройках МК какая частота выставлена?

для 4МГц делитель для АЦП=1/16

4МГц частота стоит. А слово конфигурации туда вписывать нужно? Или оно из прошивки загруженной берётся?

Поставил делитель 1/16, проблема осталась(..

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

Если программа пишется под симулятор, то его надо ковырять. Я рекомендую делать в железе, лично для меня так проще. Не надо еще с глюками протеуса бороться. Я бы эту строку написал бы так

while(GODONE);

не выбран канал, аналоговый, в ADCON0

мне кажется пока к железкам рано переходить, поэтому буду мучить симулятор) тем более есть проекты которые там работают, только без исходников)

по поводу канала, из даташита биты 4-2 отвечают за канал, у меня 000, что соотвествует AN0:

bit 4-2 CHS2:CHS0: Analog Channel Select bits

000 =Channel 00 (AN0)

001 =Channel 01 (AN1)

010 =Channel 02 (AN2)

011 =Channel 03 (AN3)

100 =Channel 04 (AN4)

101 =Channel 05 (AN5)

110 =Channel 06 (AN6)

111 =Channel 07 (AN7)

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

Проблема решена, как обычно причина не решаемых вопросов, оказывается до нельзя банальной)

Почему то нельзя вход ацп вешать на Vdd индикатора. Поставил батарейку подключил на вход, проблема решилась.

Но меряет почему то не верно.. От 3V батарейки, получил значение 640. Где то встречал, что цифру полученную с ацп, нужно ещё на 2 умножать, но здесь больше напрашивается, что нужно наоборот делить на 2..

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

Опорка 5в. 10бит ацп. 3*1024/5=614...

> Правила форума <

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

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

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

Опорка 5в. 10бит ацп. 3*1024/5=614...

Про эти вычисления забыл напрочь.. Спасибо!

Ещё вопрос нарисовался. Допустим меряю источник 4.78В

 int h_adc, l_adc;
unsigned int buf1, buf2;
char ss[];

lcd_init();

while (1)
{
__delay_ms(100);
GODONE=1;
while (GODONE) {}
l_adc=ADRESL;
h_adc=ADRESH;
buf1=(l_adc+h_adc*256)*5;
buf2=buf1%1024;
buf1=buf1/1024;

lcd_goto(0);    
sprintf(ss, "U=%d.%d V ", buf1, buf2);
lcd_puts(ss);
lcd_goto(0x40);    
sprintf(ss, "UU=%dA ", 0);
lcd_puts(ss);
}

Получаю buf1=4, buf2=794. Откуда взялось 794?

С ацп считано значение 978. 978*5/1024=4.775390625, т.е. в buf2 должно быть 77539.. (до какого разряда обрезается значение тоже не понятно), а у меня почему то 794..

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

Причём тут остаток от деления и дробная часть ? Это две разные вещи.

Математика 3 класса... ужас... :vava:

ничего не могу придумать в свое оправдание, наверное жара влияет так :crazy: глупость пришла с какого то из примеров :rake:

переделал код, принял он вот такой вид:

GODONE=1;
while (GODONE) {}
l_adc=ADRESL;
h_adc=ADRESH;
buf3=(l_adc+h_adc*256)*5;
buf1=buf3/1024;
buf2=((buf3/1024)-buf1)*100;
lcd_goto(0);   
sprintf(ss, "U=%d.%d V ", buf1, buf2);
lcd_puts(ss);
lcd_goto(0x40);   
sprintf(ss, "UU=%d A ", buf3);
lcd_puts(ss);

В buf2 всё время 0...

Я скоро с ума сойду с этими примитивными задачами на которые уходит время часами :wall::shok:

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

Чтобы получить дробную часть, остаток же тоже нужно делить :)

buf1=(l_adc+h_adc*256)*5;
buf2=buf1%1024;
buf1=buf1/1024;
buf2*=1000; // 794*1000 = 794000
buf2/=1024; // 794000/1024 = 775 - вот они, ваши тысячные ....
lcd_goto(0);
sprintf(ss, "U=%d.%d V ", buf1, buf2);

Если нужно до сотых, то умножаем не на 1000, а на 100, тогда получим 77 - это будут сотые от деления.

PS: Не забывайте, переменные должны быть размером больше 2-х байт.

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

buf1=(l_adc+h_adc*256)*5;
buf2=buf1%1024;
buf1=buf1/1024;
buf2*=1000; // 794*1000 = 794000
buf2/=1024; // 794000/1024 = 775 - вот они, ваши тысячные ....
lcd_goto(0);
sprintf(ss, "U=%d.%d V ", buf1, buf2);

Оно работает :dance2::thank_you2:!!!

честно говоря даже не слышал о таком методе получения дробной части :umnik2: если не трудно киньте пож ссылкой где разжёван этот метод :vava::thank_you2:

не даёт покоя, почему всё таки не работает этот способ? buf2=((buf3/1024)-buf1)*100;

больше 2х байт я так понимаю акутально только для buf2?

ещё вопрос возник, а чем отличаются два куска кода? этот:

buf2=buf1%1024;
buf2*=100;
buf2/=1024;

и этот:

buf2=(buf1%1024)*100/1024;

первый работает правильно, второй чушь какую то выдает :wacko:

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

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

Представьте, например Вы делите число 15 на 4, результатом будет - 3.75, это если с дробью. Если с целым числом, то частное будет равно 3, остаток тоже 3. Сразу видно, что остаток (число 3) никак не связан с дробной частью (75/100). Так вот, чтобы получить дробную часть, нам этот остаток также нужно поделить на 4, т.к. мы его отсеяли и он остался неделимым. В итоге, если 4 разделить на 3, получается 0.75 - вот она, эта дробная часть. Но нам её нужно привести к целому числу, предположим с точностью до сотых. Для этого мы умножаем наш остаток на 100 и только после этого делим результат на 4, получается 300/4 = 75.

Вот и вся арифметика :)

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

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

Представьте, например Вы делите число 15 на 4, результатом будет - 3.75, это если с дробью. Если с целым числом, то частное будет равно 3, остаток тоже 3. Сразу видно, что остаток (число 3) никак не связан с дробной частью (75/100). Так вот, чтобы получить дробную часть, нам этот остаток также нужно поделить на 4, т.к. мы его отсеяли и он остался неделимым. В итоге, если 4 разделить на 3, получается 0.75 - вот она, эта дробная часть. Но нам её нужно привести к целому числу, предположим с точностью до сотых. Для этого мы умножаем наш остаток на 100 и только после этого делим результат на 4, получается 300/4 = 75.

Вот и вся арифметика :)

Понял, спасибо :thank_you2:

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

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

А разъясните пож, почему два куска которые писал выше, работают по разному?
Тут не понятно. Возможно, buf1 имеет размер 2 или меньше байт. Но это только предположение. Запустите программу в отладчике и попробуйте выловить проблему.
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

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

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

    • Для исключения "стоячих волн" из-за отражения сигнала.
    • Выше вы писали: "Хочу запитать от 5 вольт и чтоб регулировалось до 3 вольт." Других вариантов питания я не увидел (или они потерялись на фоне не относящихся к делу комментариев). Так вот, падение напряжения на двух стабилизаторах слишком велико, чтобы обеспечить на выходе 3 вольта при питании 5. Если запитать вольт от 10-12, то будет работать, хоть и с "паровозным" КПД. 
    • @z_vip Начальных вопроса два: точно ли китаец выдает заявленное а то судя по выводам - вряд ли. Есть похожий там от силы половина от того что написано. И второе, для автомобильного 6А не надо как бы, знает ли это автор ? Ну и третий вопрос, для чего всё это ?
    • @Lessну возможно зарядка с меньшим током так 4 А - но напряжения не хватит, если добавить на выход выпрямителя конденсатор так на 10000 мкФ, то напряжения хватит, но ток упадет до 2,85 А - ничего даром природа не дает. Успехов Но когда у автора темы возникают такие вопросы, обычно под вопросом компетенция в разработке. Успехов    
    • конкретно совершено конкретно Vgs Vaweforms недоразвитой художник накалякал "не в масштабе". так сказать "наотипись"  если в масштабе изобразить это непотребство, то волосы встанут на дыбы не только на головеи зазор у тебя будет не 1,3+0,4, а 1,3+2*0,4=2,1. С таким зазором Ls_pri` будет такой размерности, что те несчасные клампёрные резисторы кремируются даже на хи-хи. А про 24v 7a можно даже не мечтать. Я ж говорю, мы обсуждаем достоинства и недостатки некой метафизической абстракции, плода работы некоего воспалёного воображенья. никто это чудо живьём не видел. какой то загадошный "белый квадрат" с названьем бп дёж. Что там внутри? Так я и говорю, зачем собирать эту уйню, когда нормальные выложены с видео или фотами накрайняк работы. Где в кадре нагрузка весело дымица, овоскоп мерит пульсации, аперметры и вольтметры мерят там что-то... А почему ты решил избавиться от половины "белого квадрата" отсечь ему главу 18в? микра от 12 не заробит, и все эти му...нистые тгры совсем бесполезны...  
    • Для автомобильных вообще страшно такое использовать.
    • @Пользователь_форума вопрос к вам - а зачем вам 13,6 В 5,6 А переменного тока ? Если для схемы зарядки автомобильных аккумуляторов, то немного маловато будет. Если вам нужно постоянное напряжение 13,6 В(получите немного меньше за счет падения на диодах) то можно использовать двухполупериодный выпрямитель со средней точкой на двух диодах. И проверить нагрев обмоток, возможно китайца капризный, такой ток не вытянет. Успехов  
×
×
  • Создать...