Вольтметр, который управляет выходным напряжением.

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

Собираю устройство, которое на основании измеренного напряжения своим АЦП на одном из своих портов выдает импульсы широтой, зависящей от измеренного напряжения. Пока результат такой. Зеленым цветом - сигнал на выходе, красным - этот же сигнал после фильтра, в иделе он должен быть прямой.
Изображение

Пока что интересует то, как убрать паузы в выдаче сигнала, чтобы он шел не пакетами, а непрерывно?
Код:

Код: Выделить всё

#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40
int s = 1; // переменная для хранения секунд
int o = 1;
int n=0;


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // Обработка прерывания по совпадению
{
    s++; // увеличиваем переменную каждую секунду       
    o++;
        if(o>n)  
            {  
                PORTB.0=1;
            }
        if(o>20)
            {   
                PORTB.0=0; 
                o=0;  
            }
                   
    TCNT1=0; //обнуляем таймер
}
void main(void)
{
int adc; //переменная для записи значений АЦП
int v; //переменная для сохранения значения реального напряжения в миливольтах


TCCR1A=0x00; //настройка таймера
TCCR1B=0x05;
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x08; //записываем число в регистр сравнения
TIMSK=0x10; //запускаем таймер
#asm("sei")
  
PORTB=0x00;
DDRB=0x01;

ACSR=0x80;
SFIOR=0x00;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x81;
while (1)
      {
                adc=read_adc(0); // читаем ацп с порта 0           
                v=adc*5; // ток разряда
               
                 if (v<350) // ток разряда 350 мА
                    {   
                        n=n+1;
                    }
                 if (v>350)
                    {
                        n=n-1;                      
                    }
      };
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 73964
Зарегистрирован: Вт дек 20, 2011 12:46:51
Откуда: Петроград

Сообщение Maykill »

как сложно-то
на выбор
https://www.google.ru/search?client=ope ... gws_rd=ssl
https://www.int-s.spb.ru
" Можно я лягу?"(C)
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Пн июн 05, 2017 18:07:13

Сообщение Тигрел »

Я своих программ немного написал, а в чужих еще не разбирался...
Вопрос 1. Какая тактовая?
1.1 Действительно Тактовая / (1024[ПредДелитель] * 8 ) -> Это интервал 1 Секунда?
Или "секунда" (в комментариях) это просто "каждое прерывание"?
Есть у меня версия, но нужно услышать тактовую...

А вообще, наверное, правильнее было бы, не создавать собственный программный ШИМ, а использовать аппаратный, меняя его скважность, относительно измеренного, с помощью АЦП, напряжения ...
И ресурсов меньше уйдёт, и программа, в конце концов, будет более логичной...

ЗЫ На самом деле аппаратный ШИМ это просто https://avrlab.com/node/90

Добавлено after 32 minutes 57 seconds:
[uquote="Maykill",url="/forum/viewtopic.php?p=3125229#p3125229"]как сложно-то
на выбор[/uquote]
Можно предположить, что человек будет заряжать аккумуляторы.
Можно предположить, что хочет сделать индикацию тока.
Можно предположить, что захочет сделать многозонную (по току) зарядную характеристику.
Также, можно допустить, что сделает, программно, выбор тока, в зависимости от модели аккума...
Можно предположить, что запилит разряд, с измерением ёмкости...
Это всё шутки, на самом деле сам такую чушь хочу разработать для тренировки (знаю, что есть готовые)...

Если так, то данный код не безсмысленен... :)
Ответить

Вернуться в «AVR»