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

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

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

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



CONFIG ADC

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

31

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

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

Исходник - Attiny13A, режим "Free".

'-------------------------------------------------------------------------------
  $map              ' Получаем карту распределения памяти
  $regfile = "attiny13.dat"       ' Используемый контроллер
  $crystal = 9600000       ' 1 МГц
  $framesize = 8    'размер области используемой и необходимой для преобразований
  $hwstack = 16     ' Размер аппаратного стека
  $swstack = 8      ' Размер программного стека
'----------------------  Конфигурация АЦП  -------------------------------------
  Config Adc = Free , Prescaler = 128 , Reference = Avcc
  On Adc Обработка_прерывания_ацп       ' Nosave
'--------------  Настройка входа АЦП для измерения  ----------------------------
  Admux.mux0 = 0
  Admux.mux1 = 1
'----------------------  Конфигурация портов  ----------------------------------
  Config Portb.0 = Output : Portb.0 = 0
  Config Portb.1 = Output : Portb.1 = 0
  Config Portb.2 = Output : Portb.2 = 0
  Config Portb.3 = Output : Portb.3 = 0
  Config Portb.5 = Output : Portb.5 = 0
'----------------------  Используемые переменные  ------------------------------
  Dim Данные_ацп As Word
  Dim Сырые_данные_ацп(2) As Byte At Данные_ацп Overlay
'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
  Power Adcnoise
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:
    nop

      If Данные_ацп >= 341 Then
          Portb.0 = 0
        Else
          Portb.0 = 1
      End If

      If Данные_ацп >= 682 Then
          Portb.1 = 0
        Else
          Portb.1 = 1
      End If

      If Данные_ацп >= 1000 Then
          Portb.2 = 0
        Else
          Portb.2 = 1
      End If

   Power Adcnoise
  Goto Главный_цикл
End
'===============================================================================
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
    Сырые_данные_ацп(1) = Adcl
    Сырые_данные_ацп(2) = Adch
'-------------------------------------------------------------------------------
  Return
'===============================================================================

Проект в Протеусе скинул Вам на mail.

Отредактировано sasha_1973 (2014-03-26 16:05:49)

0

32

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

Исходник - Attiny13A, режим "Free".
....

Александр, вы не учли некоторые важные детали:
1. В главном цикле вы читаете переменную, значение которой устанавливается асинхронно в прерывании, то есть вы не знаете точно, было ли уже преобразование или нет. Как минимум в первый раз вы можете получить нуль вместо данных.
2. Команда  Power Adcnoise не запускает АЦП, она переводит МК в режим минимума шумов, однако АЦП у вас работает постоянно и опять же асинхронно, вы дергаете ногами, а в это время вполне может идти измерение.

Я бы добавил в главный цикл анализ флага окончания измерения, который устанавливал бы в прерывании, сразу после перезаписи регистров Adcl и Adch в переменные. А для того, что бы получать более предсказуемый результат, в обработчике прерывания я бы останавливал АЦП, а в главном цикле, перед Power Adcnoise запускал бы.
В противном случае в Протеусе работать будет, а в железе значения АЦП будут плясать вплоть до второго разряда, команда Power Adcnoise вместо улучшения точности лишь добавит девиации.

+1

33

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

Александр, вы не учли некоторые важные детали:


Критика - двигатель прогресса! СПАСИБО!

Судя по всему, "lionsitroen" - нужен показометр, +- трамвайная остановка. Для себя, пользуюсь этим

0

34

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

Критика - двигатель прогресса! СПАСИБО!

Судя по всему, "lionsitroen" - нужен показометр, +- трамвайная остановка. Для себя, пользуюсь этим

Это не критика, это "опыт, сын ошибок трудных" :) Оверсемплинг и усреднение не в состоянии добавить точности если все прыгает от дерганья ногами емкостной нагрузки. Я не про разрядность шума, а про именно измерения, их лучше проводить в режиме тишины, тогда будет измеряться не "средняя температура по больнице включая морг и крематорий" :) а реальные показания, включите ADC перед Power Adcnoise и выключите сразу после измерения и у вас не будет забития от шума, которые вы потом еще и растяните в 12 разрядов.
Псевдоточность порой выкидывает неприятные сюрпризы в реальной конструкции. :(

0

35

sasha_1973, IgorL

Спасибо за науку.
Показометр я уже собрал, работает. Просто стало интересно почему  именно в протеусе не работает моя модель с режимом free. Кстати, собрал небольшую зарядку для акума шуруповерта.

Source
Код:
$regfile = "attiny13a.dat"
$crystal = 1200000

Red Alias Portb.0
Green Alias Portb.4
Yell Alias Portb.2
Config Green = Output                                       'зарядка
Config Red = Output                                         'разрядка
Config Yell = Output                                        'индикатор питания, а после зарядки индиктор готовности
Config Adc = Free , Prescaler = Auto , Reference = Avcc
Acsr = &B01000011                                           'настройка АС

Dim Temp As Word
Dim Temp2 As Word
Dim Minu As Word                                            'нижняя граница напряжения для РАЗрядки
Dim Maxu As Word                                            'верхняя граница напряжения для ЗАрядки
Dim State As Byte                                           'текущее состояние:'0-ничего не делает'1-разряд 2-заряд 3-готово
Dim Times As Word                                           'Секунды
Dim Eestate As Eram Byte
Dim Eetimes As Eram Word
Maxu = 992                                                  '21,6 (U) * 0,238(делитель) * 202,37 (ед на 1 вольт)
Minu = 747                                                  '15,5 (U) * 0,238(делитель) * 202,37 (ед на 1 вольт)


Start Adc
Enable Aci                                                  'включим компаратор
On Aci Int_aci
Waitms 300                                                  'ждем подключения внутреннего ИОН к АС. Иначе срабатывает прерывание
Enable Interrupts

State = Eestate                                             'вспомним все!
Times = Eetimes
'начало основоной программы
Yell = 1
Do
   'определим наличие акб
   Temp2 = 0
   For Temp = 1 To 20
      Temp2 = Temp2 + Getadc(3)
      Waitms 50                                             '1 секунда 20 измерений
   Next Temp
   If Temp2 > 9739 Then                                     '20(измерений) * 10 (U опр) * 0,238(делитель) 204,6 (ед на 1 вольт)
      'АКБ подключен
      'приступим..
      Temp2 = Getadc(3)

      If State = 1 Then                                     'разрядка
         If Temp2 > Minu Then
            Red = 1
         Else
            Red = 0
            State = 2
         End If
      Elseif State = 2 Then                                 'зарядка
         Incr Times
         If Temp2 < Maxu And Times < 36000 Then             '10 hours
            Green = 1
         Else
            Green = 0
            State = 3
            Times = 0
         End If
      Elseif State = 3 Then                                 'конец цикла
         Toggle Yell
      Else                                                  'первый запуск
         State = 1
         Times = 0
         Gosub Eerec
      End If
   Else
      'АКБ не пдключен
      State = 1
      Times = 0                                             'утсановим начальный статус
      'Выключим все
      Red = 0
      Yell = 1
      Green = 0
      Gosub Eerec                                           'АКБ нет, стриаем аварии из EEPROM если они есть
   End If
Loop
End

Int_aci:                                                    'прерывание компаратора
'может запретить прерывания?
   Yell = 0
   Green = 0
   Red = 0

   Gosub Eerec
                                                             'сигнализироуем о том что произошел сброс питания, на случай если
   For Temp = 1 To 5
      Yell = 1
      Waitms 50
      Yell = 0
      Waitms 50
   Next Temp
   Yell = 1
Waitms 1000
Return

'запись в eeprom текущей нформации о состоянии
Eerec:
   If Eestate <> State Then
      Eestate = State
   End If

   If Eetimes <> Times Then
      Eetimes = Times
   End If
Return

Так вот там АЦП работает в режиме Free и в железе все работает. В протеусе данное устройство целиком не моделировал, но думаю оно не заработает из-за режима.

Почему необходмы танцы с бубном с режимом Free для протеуса я так и не понимаю..

Кстати, sasha_1973, прошу прощения за возможно глупый вопрос, но зачем Вы притормаживаете камень NOPом в начале основного цикла? Что это дает?

0

36

Режим Free это режим непрерывного преобразования, режим Single одиночного. Во всяких контролях напряжения выгодней и проще, IMHO, использовать Single, Free это что то для анализа переменного или когда нужна быстродействующая защита. Так же Free можно использовать и для контролей, но понимая, что измерение в неподходящий момент времени может давать неожиданные результаты, токи и напряжения в переходные моменты сильно отличаются от статики.

0

37

Мммм... как интересно! А можно ADC конфигурировать 8 битным? Мне очень нужна скорость обработки в динамической индикации светодиодных сигментов, а эти вычисления с этими переменными очень тормозят всё.

0

38

В режиме Free ничего не тормозит, забираешь данные по мере надобности.

0

39

а можно гдето найти эти исходники: Atmega8 = Синусоида + АЦП + USART ? а то ссылки битые

0

40

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

а можно гдето найти эти исходники: Atmega8 = Синусоида + АЦП + USART ? а то ссылки битые


Вы плохо искали!

0