Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



CONFIG ADC

Сообщений 1 страница 30 из 40

1

При настройках АЦП в массе просмотренных примеров обычно используют :
CONFIG ADC = single
но в описании Баскома указано что можно и:
CONFIG ADC = FREE .
При этом не совсем понятно в каких случаях нужно применять FREE .
Отсюда и вопрос для чего и как надо применять free ?

0

2

Добавлю и свой вопрос ) Как в баскоме включить дифференциальный режим и усиление АЦП ?

0

3

Это я уже прочитал, спасибо. Мне интересно, как это организовать именно в Баскоме...т.е. делать просто асм вставку или это как-то можно стандартными командами ? Сорри, может неправильно сформулировал вопрос.

0

4

В баскоме вроде же все регистры/порты МК вытащены на ружу, разве нельзя сделать просто прямую адресацию без асм вставки?

0

5

Спасибо !!

0

6

Оверлеем быстрее и проще собирать данные:

Код:
Dim _Adc As Word
Dim _Adcl As Byte At _Adc + 0 Overlay
Dim _Adch As Byte At _Adc + 1 Overlay
...
_Adcl = Adcl
_Adch = Adch
...

В  _Adc - будет сразу 16-битное значение.

Отредактировано RDW (2012-07-08 18:42:29)

0

7

Дабы не начинать новую тему продолжу здесь.
Вопрос по конфигурации АЦП как программной так и аппаратной.
Имеется промышленное устройство в котором заслонка, в зависимости от техпроцесса, поворачивается по часовой стрелке и против от среднего положения. Угол поворота в каждую сторону 60 градусов. На оси заслонки стоит датчик неизвестного происхождения и без маркировки. От датчика идут три провода в коробочку, схемы нет, но судя по деталям в коробочке стабилизатор напряжения и операционный усилитель. Коробочка соединена с измерительной головкой с нулём посередине. Шкала головки оцифрована в градусах отклонения заслонки. При измерениях выяснилось, что проводники соединяющие датчик имею значение +5 вольт, общий и выход сигнала.
В нулевом положении заслонки на выходе 2v, в положении -60 градусов 1,5v , в положении +60 градусов 2,5v . Возникло желание заменить старую и изношенную измерительную головку на цифровую индикацию. Если-бы выходное напряжение датчика, при переходе из одного крайнего положения в другое, менялось бы от 0 до 5 вольт то изготовить устройство на микроконтроллере не составило бы труда. Отсюда вопрос, можно ли каким либо образом усилить  сигнал датчика дабы получить желаемые 0-5V? Или как программно пересчитать данные АЦП дабы получить значение -60-0-+60 ?

0

8

У вас обычная линейная функция вида y=kx+b
По двум известным точкам узнаете коэф. k & b
И все.
Вопрос точности, как я понимаю, для вас не актуален, так что весь диапазон будет разбит на 200 значений.

Upd. Если использовать. к примеру, Атмегу8 с ее internal Aref=2.56V,  то можно эффективно использовать 400 точек диапазона АЦП.

Отредактировано Civil (2012-09-07 20:35:29)

0

9

Civil
Спасибо за формулу

Civil написал(а):

У вас обычная линейная функция вида y=kx+b

при internal Aref=2.56V, и 400 точках получается очень даже хорошо, и коэффициенты не настолько кривые как при 5 вольтах.
Спасибо всем ответившим!

0

10

Пытался изучать  CONFIG ADC из хелпа.
В таблице "REFERENCE = opt"  не нашёл Мегу8, в даташите на мегу8 указанно что можно использовать внешнюю опору, а как это указать в коде не пойму. Подскажите!
И еще в таблице указанно значение VALUE=value , для чего это и как применять?

0

11

Mrshilov написал(а):

ADC_REFMODEL=8.

Ну тут немножко понятно, спасибо.
Ещё немножко о значениях, в хелпе указано AREF или OFF , получается для внешнего источника можно указать любое из предложенных значений? Также для внутренней опоры 2,56 значения приведены INTERNAL or INTERNAL_2.56 и они равнозначны?

0

12

Mrshilov написал(а):
Код:
Config Adc = Single , Prescaler = 32  'частота АЦП - 500кГц
Admux = &B11101011                               'внутр.2.56V, усиление 200, ADC0-ADC1
Start Adc
  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Adsra.6 = 1                                               'Запуск измерения
Waitus 300                                                'ждем окончания измерения

Result = Adcl                                             'считывем младший байт результата
Word_temp = Adch                                    'считываем старший байт результата
Shift Word_temp , Left , 8
Result = L + Word_temp                            'результат


Вопрос, а если я использую ADC  в режиме Free,
Мне минуя измерение Adsra.6 = 1  и задержку в 300мкс можно срузу работать с регистрами?

0

13

Mrshilov
Спасибо.
Еще вопрос,
Adsra.6 = 1 или Adcsra.6 = 1?
Ибо компилятор ругается
Камень m8 в TQFP32

Отредактировано demonizer (2012-11-07 08:55:12)

0

14

demonizer написал(а):

Mrshilov написал(а):

    Код:

    Config Adc = Single , Prescaler = 32  'частота АЦП - 500кГц
    Admux = &B11101011                               'внутр.2.56V, усиление 200, ADC0-ADC1
    Start Adc
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Adsra.6 = 1                                               'Запуск измерения
    Waitus 300                                                'ждем окончания измерения

    Result = Adcl                                             'считывем младший байт результата
    Word_temp = Adch                                    'считываем старший байт результата
    Shift Word_temp , Left , 8
    Result = L + Word_temp                            'результат

Вопрос, а если я использую ADC  в режиме Free,
Мне минуя измерение Adsra.6 = 1  и задержку в 300мкс можно срузу работать с регистрами?

Mrshilov написал(а):

Да, в этом случае достаточно один раз в начале программы запустить измерение командой Adsra.6 = 1 и подождать 300мкс до окончания первого измерения. Дальше просто считывать результаты.
Обязатьльно считывать сначала младший байт, затем старший.


Добрый день,
у меня не получается использовать режим Free, первое преобразование делается и выдаётся на LCD дисплей, а потом кручу потенциометр на входе ADC, а на дисплее ничего не меняется, всегда первое значение показывает. А вот в режиме Single всё работает как надо.
Но использовать режим Single мне нельзя, т.к. на это уходит недопустимо много времени (мне нужно захватывать значения ADC в прерывании, длительность которого не должна превышать 100 мкс).. Как можно поступить?

Отредактировано dines (2013-12-14 19:07:56)

0

15

dines написал(а):

у меня не получается использовать режим Free

Исходник, при данных настройках время преобразования ~50 мкс, АЦП работает в фоновом режиме (Free)

$map              ' Получаем карту распределения памяти
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 1000000       ' 1 МГц
'  $crystal = 8000000       ' 8 МГц
  $framesize = 32   'размер области используемой и необходимой для преобразований
  $hwstack = 40     ' Размер аппаратного стека
  $swstack = 16     ' Размер программного стека
  $baud = 4800      '4800     '9600     '19200     '38400

'----------------------  Конфигурация АЦП  -------------------------------------

  Config Adc = Free , Prescaler = 4 , Reference = Avcc

  On Adc Обработка_прерывания_ацп Nosave

'----------------------  Используемые константы  -------------------------------

'----------------------  Используемые переменные  ------------------------------

  Dim Данные_ацп As Word

  Dim Сырые_данные_ацп(2) As Byte At Данные_ацп Overlay

'------------------  Запуск и предварительные настройки  -----------------------

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

  Start Adc

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л

'===============================================================================
  Главный_цикл:

    nop

    Print Данные_ацп
    Print

   Power Adcnoise
  Goto Главный_цикл
End
'===============================================================================

'                        П О Д П Р О Г Р А М М Ы

'===============================================================================

'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
    !Push R30       ' Сохраняем регистры, которые используем в обработке
    !In R30 , Sreg
    !Push R30
    !push R31

    !in R30 , adcl
    !in R31 , adch

    !sts {Сырые_данные_ацп(1)} , R30
    !sts {Сырые_данные_ацп(2)} , R31

    !pop R31        ' Восстанавливаем регистры, которые используем в обработке
    !pop R30
    !Out Sreg , R30
    !Pop R30
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://s7.uploads.ru/t/sWAf9.jpg

Отредактировано sasha_1973 (2014-01-18 06:33:56)

0

16

sasha_1973, большое спасибо, действительно быстрый код, взял на вооружение.
Но в данном случае это не совсем то что нужно. Суть работы устройства такова: Мега16 генерирует синус (с постоянной частотой дискретизации) и выдаёт его на R-2R ЦАП, потом этот синус проходит через внешнее исследуемое устройство и возвращается в тот же микроконтроллер на АЦП.
Для частоты дискретизации генерации синуса используется Таймер0 и его прерывание, т.е. очередной отчёт синуса выдаётся в обработчике прерывания Таймера0. И использовать в этом микроконтроллере другие прерывания крайне нежелательно, так как это может отразится на стабильности частоты дискретизации (а следовательно и на самой частоте) генерируемого синуса, а стабильность частоты там нужна высокая, доли герца. По этому я пытаюсь впихнуть захват данных АЦП в обработчик прерывания Таймера0. В теории получается очень чётко, только мы выдали на ЦАП очередной отчёт синуса, как тут же (прошедшим через исследуемое устройство) оцифровали его АЦП.
Но загвоздка в том что при режиме работы АЦП Single плывёт частота дискретизации, а при режиме Free АЦП срабатывает лишь однократно в самом начале.
Я не силён в асме, и просто в лоб попробовал перенести код асма из прерывания ацп в главный цикл (из вашего примера) - ничего не вышло.
Моя задача вообще реализуема или я много хочу от одного микроконтроллера? :)

Вот пример без лишних наворотов, только основа, можно менять режим АЦП в конфиге (Single --- Free) и смотреть результат на осцилоскопе и терминале:
http://us.ua/1303267/

0

17

dines написал(а):

Моя задача вообще реализуема или я много хочу от одного микроконтроллера?

Вы имели ввиду это:

http://s7.uploads.ru/t/YrK6U.jpg

0

18

Ну да, что то типа этого.
В общем не получается ни как забирать данные с АЦП непосредственно в обработчике прерывания таймера. Сделал по другому, взял код по типу вашего, где АЦП работает в режиме Free и перезапускается в прерывании АЦП. Прерывания АЦП работают довольно шустро, и вроде как не влияют на стабильность прерываний таймера, в котором генерится синус. Так вот я просто в обработчике прерывания таймера присваиваю новой переменной значение той переменной, в которую записываются данные АЦП в обработчике прерывания АЦП.
Так всё работает как и задумывалось:)

Отредактировано dines (2013-12-17 14:32:45)

0

19

Atmega8 = Синусоида + АЦП + USART
Симуляция в Протеус 7.10 - скачать

http://s7.uploads.ru/t/CnzZR.jpg


Atmega328 = 4 синусоиды + 6 АЦП + USART (460800 бод)
Симуляция в Протеус 7.10 - скачать

Работа в железе, без кварца наблюдается изменение выходной частоты в пределах +-1 Гц.
После установки кварца 7,3728 Мгц, нестабильность выходной частоты +-0,02Гц

http://s7.uploads.ru/t/2QUKa.jpg

Передача данных с АЦП через USART, скорость 460800 бод

http://s6.uploads.ru/t/ZuHBs.jpg

Осциллограф

http://s7.uploads.ru/t/6cTY3.jpg

0

20

Большое спасибо!

0

21

Atmega328P, частота 18,3728 МГц
6 каналов АЦП (режим работы Free)
USART скорость трансляции 460800 бод/сек
3 синусомды с частотой 50 Гц и смещённые по фазе на 120° - реализованы аппаратными средствами МК

Симуляция (Протеус 7.10) + прошивка  - скачать

http://s7.uploads.ru/t/aWhRQ.jpg

http://s6.uploads.ru/t/8zeYn.jpg

http://s6.uploads.ru/t/vLIHz.jpg

Отредактировано sasha_1973 (2013-12-20 12:17:20)

+1

22

sasha_1973 написал(а):

Симуляция (Протеус 7.10) + прошивка  - скачать


по ссылке нет исходников

0

23

Давайте mail в ЛС

0

24

написал в лс

0

25

СПАСИБО

0

26

а по поводу ds1820 ничего нет?

0

27

СПАСИБО поищу

если что, поможете с кодом?

0

28

Пишите в соответствующих темах, если не я, то другие точно помогут!

0

29

Здравствуйте. С недавних пор осваиваю AVR контроллеры и столкнулся с проблемой.

На Attiny13a пытаюсь реализовать работу ADC.

простейшая программа
Код:
$regfile = "attiny13.dat"
$crystal = 9600000

Config Adc = Free , Prescaler = Auto , Reference = Avcc
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output

Start Adc

Do

If Getadc(2) >= 341 Then
Portb.0 = 0
Else
Portb.0 = 1
End If
If Getadc(2) >= 682 Then
Portb.1 = 0
Else
Portb.1 = 1
End If
If Getadc(2) >= 1000 Then
Portb.2 = 0
Else
Portb.2 = 1
End If
Loop
End

в протеусе не работает.
Стоит только поменять режим работы ADC на Single все начинает работать как надо..
Почему так происходит? Я что-то делаю не так или это глюк протеуса? Будет ли данное устройство работать в железе?

Заранее спасибо за помощь.
Файлы проекта и исходник

0

30

Mrshilov написал(а):

Протеус не при чем, просто режим "Free" не для начинающих.


Расскажите пожалуйста поподробнее, почему протеус не работает в этим режимом? И что сделать чтобы заработал?
Заранее спасибо.

0