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

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

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

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


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


Измерение собственного питания МК

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

1

Aref через 0,1мкф на землю

Исходник

$regfile = "m328pdef.dat"
  $crystal = 1000000
  $framesize = 128
  $hwstack = 128
  $swstack = 128

'===============================================================================
'           Включение / выключение питания аппаратных модулей МК
'===============================================================================
  Prr = &B_1011_1000
'         |||| ||||
'         |||| |||+--- 0 - PRADC    - если 1, то модуль ADC (АЦП) выключен
'         |||| ||+---- 1 - PRUSART0 - если 1, то модуль USART выключен
'         |||| |+----- 2 - PRSPI    - если 1, то модуль SPI выключен
'         |||| +------ 3 - PRTIM1   - если 1, то Timer1/Counter1 выключен
'         |||+-------- 4 - PRUSART1 - если 1, то модуль USART1 выключен
'         ||+--------- 5 - PRTIM0   - если 1, то Timer0/Counter0 выключен
'         |+---------- 6 - PRTIM2   - если 1, то Timer2/Counter2 выключен
'         +----------- 7 - PRTWI    - если 1, то модуль TWI (I2c) выключен, после включени обязательна повторная инициализация

'===============================================================================
'                Н А С Т Р О Й К А     TIMER2  софтовые часы
'===============================================================================
  Config Timer2 = Timer , Async = On , Prescale = 128       ' Делитель 32768 / 128 / 256 = 1 сек (прерывание TIMER2 = 1 раз в секунду)

'Ссылка на подпрограмму обработчика прерывания TIMER2, для работы часов
  On Timer2 Обработка_прерывания_timer2 Nosave       ' Ссылка на подпрограмму обработчика прерывания TIMER2

  Stop Timer2
  Timer2 = 0

  Waitms 3000

'===============================================================================
'                      Н А С Т Р О Й К А     АЦП
'===============================================================================

  Const Опорное_aref = &B_0000_0000
  Const Опорное_avcc = &B_0100_0000
  Const Опорное_internal_1_1v = &B_1100_0000

  Const Channel_temperature = &B_0000_1000
  Const Channel_internal_1_1v = &B_0000_1110
  Const Channel_gnd_0v = &B_0000_1111

'SM2 SM1 SM0 Sleep Mode
' 0   0   0    Idle
' 0   0   1    ADC Noise Reduction
' 0   1   0    Power-down
' 0   1   1    Power-save
' 1   0   0    Reserved
' 1   0   1    Reserved
' 1   1   0    Standby(1)

'&B_0000_0000
'        ||||
'        ||||
'        |||+-------- Bit 0 – SE: Sleep Enable
'        ||+--------- Bit 1 – SM0: Sleep Mode Select Bit 0
'        |+---------- Bit 2 – SM1: Sleep Mode Select Bit 1
'        +----------- Bit 3 – SM2: Sleep Mode Select Bit 2
'

  Const Значение_idle = &B_0000_0001
  Const Значение_adcnoise = &B_0000_0011
  Const Значение_powersave = &B_0000_0111
  Const Значение_powerdown = &B_0000_0101

  Config Adc = Single , Prescaler = 128 , Reference = Avcc
  Start Adc

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

'Формула расчёта: 1024 * 0,99...1,21 = 1013,76...1239,04

'Реальный МК Atmega328P
'Const Const_коэффициент_перещета_1_1v = 1097.5       'Зависит от конкретного экземпляра МК, т.к., согласно документации 1.1V ± 10%, т.е., 1...1.2V

'Реальный МК Atmega328P
  Const Const_коэффициент_перещета_1_1v = 1090       'Зависит от конкретного экземпляра МК, т.к., согласно документации 1.1V ± 10%, т.е., 1...1.2V

  Dim Флаг_критический_разряд As Byte

  Dim Temp_ацп_avcc_word As Word : Temp_ацп_avcc_word = 0
  Dim Данные_ацп_avcc_word As Word : Данные_ацп_avcc_word = 0

  Dim Vcc_txd_nrf24l01_word As Word
  Dim Vcc_txd_nrf24l01_low_byte As Byte At Vcc_txd_nrf24l01_word Overlay
  Dim Vcc_txd_nrf24l01_high_byte As Byte At Vcc_txd_nrf24l01_word + 1 Overlay

  Dim Vcc_txd_nrf24l01_sin As Single

  Dim Flag_передать_данные As Byte

  Dim Timer_sec As Byte : Timer_sec = 30

  Dim Val_timer_sec As Byte : Val_timer_sec = 30

  Dim Flag_update_time As Byte

'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc

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

  Gosub Измерение_avcc

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

'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

            If Timer_sec = 0 Then

                Счетчик_измерений_long = Счетчик_измерений_long + 1

                Prr = &B_1011_1010
               '         |||| ||||
               '         |||| |||+--- 0 - PRADC    - если 1, то модуль ADC (АЦП) выключен
               '         |||| ||+---- 1 - PRUSART0 - если 1, то модуль USART выключен
               '         |||| |+----- 2 - PRSPI    - если 1, то модуль SPI выключен
               '         |||| +------ 3 - PRTIM1   - если 1, то Timer1/Counter1 выключен
               '         |||+-------- 4 - PRUSART1 - если 1, то модуль USART1 выключен
               '         ||+--------- 5 - PRTIM0   - если 1, то Timer0/Counter0 выключен
               '         |+---------- 6 - PRTIM2   - если 1, то Timer2/Counter2 выключен
               '         +----------- 7 - PRTWI    - если 1, то модуль TWI (I2c) выключен, после включени обязательна повторная инициализация
               ' Примечание:

                Ddrb = &B_1111_1111 : Portb = &B_0000_0001
                Ddrc = &B_1111_1111 : Portc = &B_0000_0000
                Ddrd = &B_1111_1011 : Portd = &B_0000_0000

                'Ucsr0b.rxen0 = 1       'Включаем приёмник USART
                'Ucsr0b.txen0 = 1       'Включаем передатчик USART

                Gosub Измерение_avcc

'                Print ""
'                Print Счетчик_измерений_long
'                Print Vcc_txd_nrf24l01_word
'                Print Готов_темпер_ds18b20_sin
'                Print Готов_темпер_ds18b20_int
'                Print ""

                Timer_sec = Val_timer_sec

                'Gosub Передать_данные_nrf24l01

                'Gosub Выключаем_все_ненужное

                Flag_передать_данные = 0
            End If

    !ldi R16 , Значение_powersave       'Выставляем, как будем спать
    !sts SMCR , R16       'Пишем в региср
    !sleep       'Отправляемся спать

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

'===============================================================================
  Измерение_avcc:
'-------------------------------------------------------------------------------
    Adcsra.aden = 1       'Включаем АЦП
    Waitms 250       'Ждём, пока запустится источник внутреннего опорного напряжения 1.1V, от частоты работы МК не зависит

    Admux = &B_0101_1111       'Готовимся разряжать ёмкость
    Waitus 70       'Ждём, пока разрядится ёмкость, рекомендовано Atmel  стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)

    !ldi R16 , Значение_adcnoise       'Выставляем, как будем спать
    !sts SMCR , R16       'Пишем в региср
    !sleep       'Отправляемся спать

    !nop
    !nop
    !nop

    Admux = &B_0101_1110       'Готовимся измерять Avcc (1.3V(VBG) стр.259   http://www.atmel.com/images/atmel-8159- … asheet.pdf)

    Waitus 70       'Время ожидания заряда ёмкости, рекомендовано Atmel  стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)

    !ldi R16 , Значение_adcnoise       'Выставляем, как будем спать
    !sts SMCR , R16       'Пишем в региср
    !sleep       'Отправляемся спать

    !nop
    !nop
    !nop

    Vcc_txd_nrf24l01_sin = Const_коэффициент_перещета_1_1v / Данные_ацп_avcc_word
    Vcc_txd_nrf24l01_word = Vcc_txd_nrf24l01_sin * 100

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
    !push R16

    !lds R16 , adcl
    !sts {Данные_ацп_avcc_word} , R16

    !lds R16 , adch
    !sts {Данные_ацп_avcc_word + 1} , R16

    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

+1

2

Коррекция показаний из-за разброса опорного 1.1v   -  Const Const_коэффициент_перещета_1_1v = 1100 
Напряжение питания МК с точкой и всеми знаками после запятой в этой переменной  -  Vcc_sin
Напряжение питания МК с двумя знаками после запятой но без запятой в этой переменной  -  Vcc_word

Железа нет, так что надо пробовать, возможны проблемы по причине не соответствия документации и реального МК. Прецеденты были.

Исходник для Attiny84

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

  Const Const_коэффициент_перещета_1_1v = 1100

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

  $regfile = "attiny84.dat"       'Документация на МК http://ww1.microchip.com/downloads/en/D … oc8183.pdf
  $crystal = 1000000
  $framesize = 64
  $hwstack = 64
  $swstack = 64

  Config Portb.0 = Output
  Open "comb.0:4800,8,n,1" For Output As #1       ' TXD на Portb.0

'===============================================================================
'                      Н А С Т Р О Й К А     АЦП
'===============================================================================

  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_word As Word
  Dim Vcc_sin As Single

'--------------  Разрешаем работу необходимых прерываний  ----------------------

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

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

'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

     Gosub Измерение_avcc

     Print #1 , Vcc_word

     Waitms 500

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

'===============================================================================
  Измерение_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

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
    !push R16

    !lds R16 , adcl
    !sts {Данные_ацп_avcc_word} , R16

    !lds R16 , adch
    !sts {Данные_ацп_avcc_word + 1} , R16

    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

+2


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