Страница 2 из 3
Добавлено: Пн май 04, 2009 17:26:15
sachok
Ну уж если Вы спрашиваете зачем там ШИМ товам не сюда нужно обращатся, а в кружок радио електроники... Посмотрите что стоит на порте где регулируется нипряжение. Не замечаете конденсатор и резистор?
Добавлено: Пн май 04, 2009 17:37:04
MDamir
Ещё раз говорю, нам про ШИМ ничего не рассказывали на лекциях. Мы ведь делаем иммитацию программирования, возможно нам не важно есть там ШИМ или нет. Главное, что бы программа была правильной, без ШИМ...
И вообще там где резистор и конденсатор- напряжение не регулируется, это порт выхода...
Добавлено: Пн май 04, 2009 18:13:11
Goodefine
MDamir , вы уже определитесь, что вам конкретно надо:
получить на выходе постоянное напряжение, амплитуда которого ступенчато регулируется приемным портом, или напряжение состоящее из 256 ступенек регулируемой длительности? Если второе, то в каком диапазоне должна регулироваться длительность, как должно себя вести после достижения верхней ступеньки - по ступенькам спадать вниз до нуля или сразу с нуля начинаться?
Нарисуйте нормальный рисунок напряжения за полный период (надеюсь, знаете что такое ПЕРИОД) напряжения, обозначьте на нем что и как должно регулироваться. Иначе испорченный телефон получается...
Добавлено: Пн май 04, 2009 18:49:09
MDamir
Пришлось прибегнуть к Пеинту))
Напряжение растёт с 0В до 255В, т.к. 1 ступень 0В- ступенек будет 256 (N=256). Горизонтальная часть ступенек, т.е. сколько будет длиться импульс напряжение- как я понял это частота повторения, она константа, задаётся портом.
Надо что бы напряжение росло с 0В до 255В и программа останавливалась.
Добавлено: Пн май 04, 2009 18:57:49
sachok
MDamir писал(а):Напряжение растёт с 0В до 255В

Ничево себе!!! Да тут одной програмкой на МК не отделаешся. Если же мудрить с ШИМом то портом нужно утанавливать значение регистров TCNT, потом наверное делать прерывание в котором увеличивать OCR. Ну в принципе тоже что уже было представлено. Вот только 255В это уже нужно аппаратно делать.
Добавлено: Пн май 04, 2009 19:03:35
MDamir
почему аппаратно? ввести бесконечно цикл, как в первом посте данной темы, и чтоб он сравнивал количество импульсов напряжения с числом 255 и стоп программа.получится как цикл в цикле
Добавлено: Пн май 04, 2009 19:07:12
MDamir
Посмотрите вот этот алгоритм, сделанный по программе предоставленной мной. Цикл в цикле. Может всё таки правильная программа? )
Добавлено: Пн май 04, 2009 19:22:55
BCluster
ну сделайте 255 ВОЛЬТ программно... Бред.
Если отмести это то кажется я понял что имелось ввиду
С порта выход на R2R должен делаться, или на другой параллельный цап
Добавлено: Пн май 04, 2009 19:30:34
ibiza11
такой путаницы я еще нигде не видел!!! Автор, тот график напряжения, что вы привели тоже не понимаю. Если ступени идут по порядку 0,1,2,3,4,5..., т.е. ступень=1В, то почему на рисунке они у вас НЕОДИНАКОВОЙ длины???
Объясните НОРМАЛЬНО что вам нужно!!!
что значит частота задается портом????? каким портом то?
Добавлено: Пн май 04, 2009 19:47:17
MDamir
Может в программе надо сделать делитель на 255? Знал бы я- не писал бы сюда.
Добавлено: Пн май 04, 2009 19:53:19
MDamir
ibiza11 писал(а):
что значит частота задается портом????? каким портом то?
Я писал задание. Задание звучит именно так- пуск и частота задаётся портом, сам точного представления этого не имею. Нарыл в интернето что то похожее. Посмотрите пожалуйста.
Добавлено: Пн май 04, 2009 20:10:31
sachok
Ну не знаю: 5/255~0,02 получится ли такова точность. А алгоритм мной описан несколько постов выше должен заработать.
Добавлено: Пн май 04, 2009 20:21:17
Goodefine
Напряжение ступеньками (256штук) скачет от 0 до 5В. Схема и графики (на одном кусок осциллограммы крупно, на другом общая картина) во вложении..
Программа:
Код: Выделить всё
/*****************************************************
CodeWizardAVR V1.25.9 Professional
Chip type : ATmega103
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1000
*****************************************************/
#include <mega103>
#include <delay>
#define PUSK_PIN PINB&1 /*ножка порта для пуска*/
#define OUT_PORT(x) PORTE=x /*макрос установки выходного порта*/
#define IN_PORT PIND /*входной порт*/
unsigned char out; //переменная для выходного значения напряжения
unsigned char step_time; //длительность ступеньки, читаем с порта
unsigned char counter; //счетчик
unsigned char fl_change; //флаг, разрешающий изменение напряжения
// Обработчик переполнения таймера Т0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
(counter==step_time)? (counter=0,fl_change=1):(counter++);
}
void main(void)
{
//--------------------------------ИНИЦИАЛИЗАЦИЯ ПЕРЕФИРИИ--------------------------//
// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=P
PORTB=0x01;
DDRB=0x10;
// Port D initialization (НА ДАННОМ ПОРТЕ ЗАДАЕТСЯ ДЛИТЕЛЬНОСТЬ)
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTD=0xFF;
DDRD=0x00;
// Port E initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTE=0x00;
DDRE=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// Глобальное разрешение прерываний
#asm("sei")
for (;;) //MAIN_LOOP
{
if(!PUSK_PIN){//если нажата кнопка
if(fl_change) {//если разрешено изменение выхода
OUT_PORT(out);
out++;
step_time=IN_PORT;
fl_change=0;
}
}else{OUT_PORT(0);/*если не нажат пуск то выводим 0*/}
}
}
Добавлено: Пн май 04, 2009 20:43:51
MDamir
Вроде бы это то что надо, щас буду обмозговывать... Огромное спасибо. позже отпишусь.
Добавлено: Пн май 04, 2009 20:46:23
Krik99
Только хотел сказать про Цифро Аналоговый Преобразователь R-2R, но Goodefine меня опередил.
А вообще, как можно что-то пытаться делать если нету вменяемого описания будущего устройства... И довольно редко на форумах бывает что за тебя пишут программу, так как восновном тут спрашуют про непонятные куски кода...
Добавлено: Пн май 04, 2009 20:57:03
MDamir
Мозгую прогу и радуюсь, есть же хорошие люди на форуме, хорошие специалисты. Щас ещё помозгую, сдаю в четверг, отпишусь.
Goodefine, пока вот не понял- как программа обнулится при достижении 256-ой ступени? И где прописано, что напряжение до 5В. Покажи часть кода пожалуйста.
Добавлено: Пн май 04, 2009 21:29:24
Goodefine
MDamir писал(а):
пока вот не понял- как программа обнулится при достижении 256-ой ступени?
Переменная out увеличивается каждый раз (out++;) за цикл. Начальное значение ее равно нулю. Поскольку она имеет тип unsigned char, то ее диапазон от 0 до 255. Когда к 255 прибавим 1-цу, то получим снова 0-ль - таким образом, специально обнулять не требуется. Это по колхозному объяснил
MDamir писал(а): И где прописано, что напряжение до 5В. Покажи часть кода пожалуйста.
Верхняя граница определяется напряжением логической 1-цы микроконтроллера. Это и есть 5В (примерно), код здесь не причем...
Добавлено: Пн май 04, 2009 21:42:52
MDamir
так-то вроде понял... Спасибо! буду сдавать ее. о результатах отпишусь...
Добавлено: Пн май 04, 2009 21:46:07
Goodefine
Все понятно? И с прерыванием от таймера? И как ЦАП работает? Тогда дерзайте

Добавлено: Пн май 04, 2009 21:51:28
ibiza11

оперативно сработал
Goodefine. после просмотра приведенной схемы все встало на свои места (насчет порта, задающего частоту)))
MDamir, с вас банка сметаны для
Goodefine, за понимание и скорость)))