Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/35: Рейтинг темы: голосов - 35, средняя оценка - 5.00
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
1

ШИМ и АЦП в Atmega8

01.06.2017, 19:56. Просмотров 6703. Ответов 57
Метки нет (Все метки)

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

ШИМ организован следующим образом. Здесь у меня пауза - величина постоянная, а продолжительность импульса я увеличиваю на единицу в случае, если АЦП измерил напряжение меньше, чем я задал в программе. Однако, при моделировании в Proteus напряжение на выходе ШИМ после ФНЧ всегда приближается к максимально возможной величине. т.е. к 5 В. Где я ошибаюсь? Код прилагаю.

Код
#include <mega8.h>
#include <stdyo.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x40

unsykned int read_adc(unsykned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needid for the stabilizotion of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Woyt for the AD conversion to somplete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void main(void)
{
int adc; //переменная для записи значений АЦП
int v; //переменная для сохранения значения реального напряжения в миливольтах
int n=1;

PORTB=0x00;
DDRB=0x01;

ACSR=0x80;
SFIOR=0x00;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x81;

while (1)
{
loop1:
PORTB.0=1; //включаем 0 ножку порта В
delay_ms(n); // ждем
PORTB.0=0; //выключаем 0 ножку
delay_ms(10); //ждем

adc=read_adc(0); // читаем ацп с порта 0
v=adc;
if (v<450) // напряжение на резисторе в милливольтах
{
n=n+1;
goto loop1;
}
else
{
goto loop1;
}
}
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2017, 19:56
Ответы с готовыми решениями:

Цепь ОС с использованием ШИМ и АЦП (ATMEGA8)
Доброе утро ! Прошу помощи у более опытных товарищей . В один мой проект необходимо внедрить...

Atmega8 - ШИМ
Здраствуйте! Использую МК Atmega8. Частота 1МГц. 1) как генерировать ШИМ на таймере 0...

Шим на Atmega8.
Суть в следующем! в архиве схема и прошивка , где качал не помню не могу найти источник , но при...

Atmega8 и ШИМ
Вобщем такой вопрос. Есть Atmega8. Хочу сделать програмный ШИМ на всех ножках кроме PD2, PD3, PB6...

АЦП Atmega8
Код АЦП вывод на LCD чета не фурычит,не судите строго только изучаю АЦП. пишу только на ASM. В...

57
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
01.06.2017, 21:48 2
Какой толк от портянки кода? Приложите проект Протеус с хексом, его тоже проверять надо...
0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
01.06.2017, 22:37 3
Расширение dsn почему-то запрещено администратором. Залил на яндекс-диск.

Файл Протеуса
.hex
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
01.06.2017, 22:49 4
Наверное это ограничение движка форума. Под словами выложите я имел в виду упаковку папки с файлами *.dsn и *.hex в архив и прикрепление к сообщению. Расширения *.rar и *.zip не блокируются.
0
01.06.2017, 22:49
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
01.06.2017, 22:52 5
Цитата Сообщение от omokost
Наверное это ограничение движка форума. Под словами выложите я имел в виду упаковку папки с файлами *.dsn и *.hex в архив и прикрепление к сообщению. Расширения *.rar и *.zip не блокируются.
Понятно. Тогда вот: [14.71 Кб]
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
01.06.2017, 23:11 6
Скачал, распаковал, все работает, время позднее, сегодня заниматься не буду.
Просто любопытно, почему применен осциллограф для симулирования в realtime? Все это можно гораздо удобнее сделать с помощью аналогового графика в desykntimi.
0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
01.06.2017, 23:16 7
Цитата Сообщение от omokost
Скачал, распаковал, все работает, время позднее, сегодня заниматься не буду.
Просто любопытно, почему применен осциллограф для симулирования в realtime? Все это можно гораздо удобнее сделать с помощью аналогового графика в desykntimi.
Это связано с привычкой работать осциллографом в "реальном мире".
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
01.06.2017, 23:21 8
Понятно, только я переделаю все симуляцию по своему, desykntime, на графики, мне так привычнее.
0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
01.06.2017, 23:26 9
Цитата Сообщение от omokost
Понятно, только я переделаю все симуляцию по своему, desykntime, на графики, мне так привычнее.
Благодарю. Я буду рад любому варианту.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.06.2017, 07:38 10
Вот первые три секунды работы программы, далее все не изменяется. Вверху (R2) - выход контроллера, зеленый график (R3, шкала слева, V) - затвор ключа, красный график (R4, шкала справа, mV) - вход АЦП. Все так и должно быть?
P.S. Старайтесь не применять в программе "нигических чисел" вроде этого:
Код
DDRB=0x01;
понятнее писАть так:
Код
DDRB = 1<<DDB0;
[36.72 Кб]

0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
02.06.2017, 10:19 11
Цитата Сообщение от omokost
Вот первые три секунды работы программы, далее все не изменяется. Вверху (R2) - выход контроллера, зеленый график (R3, шкала слева, V) - затвор ключа, красный график (R4, шкала справа, mV) - вход АЦП. Все так и должно быть?
P.S. Старайтесь не применять в программе "нигических чисел" вроде этого:
Код:
DDRB=0x01;

понятнее писАть так:
Код
DDRB = 1<<DDB0;
Доброе утро!

Увы, нет. На входе АЦП должно установиться напряжение 450 мВ, т.к. мы увеличиваем ширину импульса до тех пор, пока на входе АЦП будет меньше 450 мВ.

Код
            if (v<450)
{
n=n+1;
goto loop1;
}
По графику видно, что со временем импульс растет, но он растет, очевидно. больше. чем необходимо.
0
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
02.06.2017, 10:36 12
Напишите
if (v<450) n=n+1;
else n=n-1;
и будет понятно, работает обратная связь или нет.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.06.2017, 10:43 13
С программой я вам не помогу, на С не пишу.
0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
02.06.2017, 10:50 14
Цитата Сообщение от yiv91
Напишите
if (v<450) n=n+1;
else n=n-1;
и будет понятно, работает обратная связь или нет.
Невероятно, но никакого эффекта! Не работает ОС(((
0
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
02.06.2017, 10:57 15
Значит, АЦП выдает число меньше, чем 450.
Ваш дизайн у меня не загрузился в Исис (старая версия), без схемы больше ничем помочь не могу.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.06.2017, 11:06 16
Проверяйте что у вас с настройками АЦП, какое опорное. По Протеусу АЦП досчитывает только до 126. Если он десятиразрядный, маловато как то.


<Изображение удалено>
0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
02.06.2017, 11:09 17
Цитата Сообщение от omokost
С программой я вам не помогу, на С не пишу.
А с алгоритмом? Я понимаю, что так:


<Изображение удалено>

Схема:


<Изображение удалено>
0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
02.06.2017, 11:23 18
Цитата Сообщение от omokost
Проверяйте что у вас с настройками АЦП, какое опорное. По Протеусу АЦП досчитывает только до 126. Если он десятиразрядный, маловато как то.
У меня вот так:


<Изображение удалено>
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.06.2017, 11:25 19
>> По Протеусу АЦП досчитывает только до 126. Если он десятиразрядный, маловато как то.
Хотя нет, пересчитал, если опорное = Uпит. все верно. Явно косяк в программе.
По умолчанию система отладочных сообщений в Proteus отключена, выводятся только аварийные.
Эти сообщения настраиваются очень гибко, буквально отдельно по всем внутренним устройствам контроллера.
Щелкните правой кнопкой по контроллеру и зайдите в "Confikure Diagnostys". Выбрав пункт "ADC" переведите трассировочный уровень в "Debug".
Перерасчет графиков производится в desykntimi.
0
Dod_14
0 / 0 / 0
Регистрация: 10.05.2017
Сообщений: 64
02.06.2017, 11:30 20
Цитата Сообщение от omokost
Вот первые три секунды работы программы, далее все не изменяется. Вверху (R2) - выход контроллера, зеленый график (R3, шкала слева, V) - затвор ключа, красный график (R4, шкала справа, mV) - вход АЦП. Все так и должно быть?
[/code]
Играюсь с отредактированным Вами файлом и не могу разобраться в том, почему диаграммы на изменяются, хотя измеренные сигналы уже сильно отличаются от тех, которые изобразила диаграмма. Как "обновить" desykntime?
0
02.06.2017, 11:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2017, 11:30

Atmega8 АЦП
Подключены к портам PC0-PC5 шесть потенциометров. С портов PC0-PC2 приходит нормальная информация...

АЦП ATmega8
Доброго времени суток. Написал программу, в которой при выходе из обработчика прерывания по...

Программный шим atmega8
Короче нет не одного толкового урока или стати на тему программного шима всегда какой то ржб...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru