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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Аппаратные возможности МК серии ATTiny » Как измерить собственное напряжение питания МК?


Как измерить собственное напряжение питания МК?

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

1

Реальная тема без использования  внешних портов.
Здоровски помог наш дорогой Админ. Но код под даташит ATtiny84.

Код:
'===============================================================================
'                      Н А С Т Р О Й К А     АЦП
'===============================================================================
  Const Channel_temperature = &B_0010_0010
  Const Channel_v_bg = &B_0010_0001
  Const Channel_gnd_0v = &B_0010_0000
'&B_0000_0000
'     || |
'     || |
'     || +------- Bit 3 – SM0: Sleep Mode Select Bit 3
'     |+--------- Bit 4 – SM1: Sleep Mode Select Bit 4
'     +---------- Bit 5 – SE: Sleep Enable
  Const Значение_idle = &B_0010_0000
  Const Значение_adcnoise = &B_0010_1000
  Const Значение_powerdown = &B_0011_0000
  Const Значение_powerstandby = &B_0011_1000
  Config Adc = Single , Prescaler = 128 , Reference = Avcc
  Start Adc
  On Adc Обработка_прерывания_ацп Nosave
'Формула расчёта: 1024 * 0,99...1,21 = 1013,76...1239,04
  Dim Флаг_критический_разряд As Byte
  Dim Temp_ацп_avcc_word As Word : Temp_ацп_avcc_word = 0
  Dim Данные_ацп_avcc_word As Word : Данные_ацп_avcc_word = 0
  Dim Vcc_sin As Single
   Adcsra.aden = 0
'===============================================================================
  Измерение_avcc:
'-------------------------------------------------------------------------------
    Enable Adc
    Adcsra.aden = 1                                         'Включаем АЦП
    Waitms 250                                              'Ждём, пока запустится источник внутреннего опорного напряжения 1.1V, от частоты МК не зависит
    Admux = Channel_gnd_0v                                  'Готовимся разряжать внутреннюю ёмкость МК
    Waitus 70                                               'Ждём, пока разрядится ёмкость, рекомендовано Atmel  стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)
    !ldi R16 , Значение_adcnoise                            'Выставляем, как будем спать
    !sts MCUCR , R16                                        'Пишем в региср
    !sleep                                                  'Отправляемся спать
    !nop
    Admux = Channel_v_bg                                    'Готовимся измерять Avcc (VBG) стр.145   http://ww1.microchip.com/downloads/en/D … oc8183.pdf
    Waitus 70                                               'Время ожидания заряда ёмкости, рекомендовано Atmel  стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)
    !ldi R16 , Значение_adcnoise                            'Выставляем, как будем спать
    !sts MCUCR , R16                                        'Пишем в региср
    !sleep                                                  'Отправляемся спать
    !nop
    Disable Adc
   'Выключаем АЦП, слишком много потребляет   'Bit 7 – ADEN: ADC Enable / Disable
    Adcsra.aden = 0
   'Выключаем компаратор    Bit 7 – ACD: Analog Comparator Disable
    Acsr.acd = 0
    Vcc_sin = Const_коэффициент_перещета_1_1v / Данные_ацп_avcc_word
    Vcc_word = Vcc_sin * 100
'    Vcc_word = Vcc_word
'-------------------------------------------------------------------------------
  Return
'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
    !push R16
    !lds R16 , adcl
    !sts {Данные_ацп_avcc_word} , R16
    !lds R16 , adch
    !sts {Данные_ацп_avcc_word + 1} , R16
    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'=====================================================================

Как переписать под ATmega8?
В АСМе полный ноль.
В предустановках меги чуть по другому. Пробовал менять MUX  под мегу. Не получается.
Не работает прерывание по АЦП. Его просто не произходит.

0

2

rom-i написал(а):

В АСМе полный ноль.

Надо когда-то начинать... ;)
Вот тут http://www.gaw.ru/html.cgi/txt/doc/micr … /start.htm хорошо расписано, да еще и на русском.

+1

3

rom-i написал(а):

В предустановках меги чуть по другому. Пробовал менять MUX  под мегу. Не получается.

В вашей программе установки для регистра MCUCR Тини84:

rom-i написал(а):

'
'     || |
'     || +------- Bit 3 – SM0: Sleep Mode Select Bit 3
'     |+--------- Bit 4 – SM1: Sleep Mode Select Bit 4
'     +---------- Bit 5 – SE: Sleep Enable

Указанные биты в Меге8 немного не там расположены... ;)

rom-i написал(а):

Не работает прерывание по АЦП. Его просто не произходит.

А как "оно" произойдет, если Enable Adc есть, а Enable Interrupts нету... ;)

0

4

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

- настраиваем МК на работу с внутренним опорником напряжения для измерения АЦП (обычно в МК по разному имеется набор напряжений и вариантов опорного напряжения, выбираем тот, что находится ниже измеряемого порога работы МК (или требуемого), но самое низкое лучше не выбирать, иначе есть вероятность страдания от помех и накладывает определенные стандарты на схемотехнику);
- выбираем любой из каналов МК с АЦП и вешаем на него делитель из резисторов (делитель рассчитываем так, чтобы максимальное напряжение на МК не выходило за пределы опорного напряжения АЦП);
- настраиваем измерение АЦП по прерыванию (это нужно, чтобы измерение выполнялось, когда МК спит и когда измерение заканчивается, вся система засыпает и не вносит внутренние помехи в измерение);
- вводим МК в режим засыпание (он автоматом проснется, когда измерение закончится);
- далее полученные данные используем для своих целей.

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

+2

5

Nord
Первоначально программа была написана как советует RDW черезь порт. Но точность измерения черезь делитель желает лучьшего. Александр наш админ переписал под внутреннее измерение. Это отлично работает.
Const Channel_v_bg = &B_0010_0001
Const Channel_gnd_0v = &B_0010_0000
Настройки MUX у тини84 под измерение внутреннего образцового напряжения 1.1В Vbg.
Const Channel_v_bg = &B_0100_1110
Const Channel_gnd_0v = &B_0100_1111
Настройки MUX у меги8 под измерение внутреннего образцового напряжения 1.3В Vbg.
Именно Vbg, а не образцовое 2.56В для внешнего измерения. С этим немножко разобрался.
Вот с регистрами прошу помоши. В них далек.
Разрешения всех прерываний в программе включено. Выложил только часть интересующего года.
Вся прграмма 73% мага8 занимает. Смысл ее выкладывать. Обычная сигнализация на sim800l.
Измерение питания для автоматической зарядки аккума. Вот где стопор.
Внешнее (повторяюсь) желает лучшего. Для Li ion 3.00 - 4.20 бредит конкретно. 4.2В контролирует сам зарядник.
Вот нижнее приходится поднимать до 3.5В. Иначе иногда доходит до 2.9В, и кирдык. Аккум на защиту зтановиться.
А не полный цикл зарад/разряд разрушает аккум.

Отредактировано rom-i (2020-03-15 10:36:30)

0

6

Открываем даташиты... ;)

Состав регистра MCUCR для ATtiny84:
  7    6     5   4      3    2     1        0        - бит
  –  PUD SE SM1 SM0  –  ISC01 ISC00    - назначение
... для ATMega8:
7    6     5      4      3        2        1        0      - бит
SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00  - назначение

Разница заметна ? ;)
Наверняка она есть и для регистра ADMUX.
Открываем даташит... ;)

Отредактировано Nord (2020-03-15 12:29:39)

0

7

Nord
https://upforme.ru/uploads/0000/25/b8/2019/t52814.jpg
https://upforme.ru/uploads/0000/25/b8/2019/t79827.jpg
https://upforme.ru/uploads/0000/25/b8/2019/t44356.jpg
Получается
Const Channel_v_bg = &B_0100_1110
Const Channel_gnd_0v = &B_0100_1111

Отредактировано rom-i (2020-03-15 14:04:03)

0

8

Разобрались ?

Соответственно пересмотрите для MCUCR:
Const Значение_idle = ...
Const Значение_adcnoise = ...
Const Значение_powerdown = ...
Const Значение_powerstandby = ...

Проще обращаться к битам в регистрах "по имени", как у вас сделано в одной строке:
Adcsra.aden = 1
В таком случае компилятор сам определит нужный бит в зависимости от указанного МК.
Но тут уже без листания даташита никак... ;)
Неудобство такого способа в том, что вместо одной строки:
Admux = Channel_v_bg (например)
... придется писать несколько:
Adcsra.ххх = 1
Adcsra.ххх = 0
...
Adcsra.ххх = 1

+1

9

Nord
Вот сдесь мои познания заканчиваються. Почему, и прошу помощи.

0

10

Попробуйте:
Const Значение_idle = &B_1000_0000
Const Значение_adcnoise = &B_1001_0000
Const Значение_powerdown = &B_1010_0000
Const Значение_powerstandby = &B_1011_0000

UPD. Указанные значения будут верны, если не задействованы прерывания INT0 и INT1 !

Отредактировано Nord (2020-03-15 22:10:25)

+1

11

Nord
Спасибо.
Ответ могу дать только завтра. Конструкция на работе.
Протеус почему то вообще не понимает этого. Работает только в железе.

0

12

Nord
Отлично. Все работает.

+1

13

У меня на mega8 значения прыгают на 0,4 вольта, а то и больше. Большие я отсёк программно, а вот с мелкими прыганиями не знаю, что делать. В чём может быть причина?

0

14

Попробуйте усреднять показания. Делаете несколько замеров, складываете значения, а потом делите полученный результат на количество замеров.

0

15

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

У меня на mega8 значения прыгают на 0,4 вольта, а то и больше

Такого быть не должно. Фото трассировки платы в студию.

0

16

Может быть дело в том, что у меня Timer1 = Pwm и Timer2 = Timer?

0

17

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

У меня на mega8 значения прыгают на 0,4 вольта, а то и больше. Большие я отсёк программно, а вот с мелкими прыганиями не знаю, что делать. В чём может быть причина?

https://bascomavr.bbok.ru/viewtopic.php?id=2069Вот например

+1

18

Спасибо!

0


Вы здесь » Программирование ATMEL в BASCOM. » Аппаратные возможности МК серии ATTiny » Как измерить собственное напряжение питания МК?