Страница 126 из 160

Re: AVR studio в вопросах и ответах

Добавлено: Вт дек 20, 2016 12:57:12
strengerst
Подскажите пожалуйста можно ли менять скважность шим сигнала переменным резисторам, что бы значение не фиксированное в коде было. А принимало значение в зависимости от сопротивление скажем резистора в данный момент. Или как правильно это сделать.

Re: AVR studio в вопросах и ответах

Добавлено: Вт дек 20, 2016 13:36:19
ARV
strengerst писал(а):можно ли менять скважность шим сигнала переменным резисторам
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...

Re: AVR studio в вопросах и ответах

Добавлено: Ср дек 21, 2016 07:45:59
strengerst
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...
Не понимаю как значение сопротивление резистора передать OCR1A. С помощью АЦП как то. Я так думая что контролер должен замерять значение сопротивления и передовать и записывать это значение в переменную с которой можно было бы уже работать.

Re: AVR studio в вопросах и ответах

Добавлено: Ср дек 21, 2016 08:09:12
prinv

Re: AVR studio в вопросах и ответах

Добавлено: Ср дек 21, 2016 09:23:14
strengerst
Спасибо почитаю.

Re: AVR studio в вопросах и ответах

Добавлено: Ср дек 21, 2016 10:31:14
ozonn
strengerst писал(а):
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...
Не понимаю как значение сопротивление резистора передать OCR1A. С помощью АЦП как то. Я так думая что контролер должен замерять значение сопротивления и передовать и записывать это значение в переменную с которой можно было бы уже работать.
совершенно верно, через АЦП. Я так управляю скоростью радиоуправляемой машинки. Настраиваю АЦП на 8-ми битный формат, измеряю напряжение и передаю значение ADCH по радио на машинку, а там заношу его значение в OCR

Re: AVR studio в вопросах и ответах

Добавлено: Ср дек 21, 2016 12:27:11
strengerst
Спасибо буду пробовать. А значение скорости машинки передаете через USART?

Re: AVR studio в вопросах и ответах

Добавлено: Ср дек 21, 2016 13:11:01
ozonn
strengerst писал(а):Спасибо буду пробовать. А значение скорости машинки передаете через USART?
нет, через NRF24L01+. Через него надежнее :)

Re: AVR studio в вопросах и ответах

Добавлено: Чт дек 22, 2016 13:33:24
strengerst
Ситуация такая, хочу с помощью АЦП микроконтроллера атmega8 регулировать ШИМ сигнал на транзистор. С ШИМ вроде разобрался
при изменении данных регистра таймера OCR2 мы изменяем скважность сигнала шим и лампочка прикрепленая к транзистору меняет силу свечения. Дальше хочу с помощью переменного транзистора изменять ШИМ сигнал - управлять свечением лампочки. Тут понятно что нужно данные регистра ADCH записывать в OCR2 что бы ШИМ изменялся в зависимости от сопротивления резистора. А как правильно это сделать не знаю. Подскажите в чем я ошибаюсь. Вот схема и код.
Спойлер

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

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>


void Timer2Z ()//Функция подключения таймера в режиме шим.
{	TCCR2|=(1<<WGM20);//Выбираем режим с вазовой корекцией WGM20=1; WGM21=0;
	TCCR2|=(1<<COM21)|(1<<COM20); //Выбираем режим формирования сигнала для ШИМ:
//УстановкаOC2при совпадении во время прямого счета.
//СбросOC2при совпадении во время обратного счета.
	TCCR2|=(1<<CS22)|(1<<CS20);//Выбираем частоту синхронизации таймера. clkT2S/1024 (с предделением)
	TIMSK|=(1<<OCIE2)|(1<<TOIE2); //Разрешаем прерывания по совпадению и переполнению таймера
	TIFR|=(1<<OCF2)|(1<<TOV1); //Cбрасываем флаги прерывания если они установлены
	OCR2=0xFF;
	};
	
	
	

ISR(TIMER2_OVF_vect){ // Прерывания таймера по переполнению
	
	
}

ISR(TIMER2_COMP_vect){ // Прерывания таймера по совпадению

	
}

ISR(ADC_vect){//Прерывание от АЦП
OCR2=(ADC & (1<<ADCH));
}
	

int main(void)
{
//Подключаем аналого-цифровой преоброзователь.
ADCSRA|=(1<<ADEN);
//Выбор режима преобразования однократное или непрерывное
ADCSRA|=(1<<ADFR);// непрерывное
// Разрешение прерывание от АЦП по завершению преобразования.
ADCSRA|=(1<<ADIE); // Разрешаем прерывание.ADIF - флаг прерывания.
//Выбираем тактовую частоту АЦП рекомендуется 50-200кГЦ 
ADCSRA|=(1<<ADPS2)|(1<<ADPS0); //Что соответствует СК/32 = 4Мгц/32=125кГц
//Выбираем бит опорного напряжение относительно которого будет производится замер
ADMUX|=(1<<REFS0); //Выбираем  AVcc, с внешним конденсатором на AREF.
//Определяем как результат преобразования запишется в регистры 
ADMUX|=(1<<ADLAR);// в ADCH записываются старшие  8бит а в младшие 2 бит ADCL
//Выбираем бит аналогового канала на который будет подоватся напряжение для сравнения.
ADMUX|=(1<<MUX0)|(1<<MUX1);// Выбираем ADC3 выход на микроконтролере.


DDRB|=(1<<PB3);

	
	
    while(1)
    {

 //Задаем данные для сравнения они влияют на величину импульса. 	
	
   asm("nop");     //TODO:: Please write your application code 
    }
}

Re: AVR studio в вопросах и ответах

Добавлено: Чт дек 22, 2016 13:54:36
ARV
по-моему, у вас в коде не хватает запуска АЦП на первое измерение, т.е. ADCSRA |= _BV(ADSC);
ну и, разумеется, глобального разрешения прерываний sei(); не вижу перед главным циклом

P.S. корректность установки прочих битов в регистрах таймера и т.п. не проверял - путаный код...

Re: AVR studio в вопросах и ответах

Добавлено: Чт дек 22, 2016 14:13:09
strengerst
Спасибо сейчас попробую. ADCSRA|=(1<<ADSC); - Так вроде как это для однократного преобразования, а уменя в коде стоит непрерывное преобразование?

Ну вот исправил на однократное ну все равно что то не так:
Все надо идти смогу отписаться только завтра. Если не сложно напишите в чем еще может быть причина
Спойлер

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

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>


void Timer2Z ()//Функция подключения таймера в режиме шим.
{	TCCR2|=(1<<WGM20);//Выбираем режим с вазовой корекцией WGM20=1; WGM21=0;
	TCCR2|=(1<<COM21)|(1<<COM20); //Выбираем режим формирования сигнала для ШИМ:
//УстановкаOC2при совпадении во время прямого счета.
//СбросOC2при совпадении во время обратного счета.
	TCCR2|=(1<<CS22)|(1<<CS20);//Выбираем частоту синхронизации таймера. clkT2S/1024 (с предделением)
	TIMSK|=(1<<OCIE2)|(1<<TOIE2); //Разрешаем прерывания по совпадению и переполнению таймера
	TIFR|=(1<<OCF2)|(1<<TOV1); //Cбрасываем флаги прерывания если они установлены
	OCR2=0xFF;
	};
	
	
	

ISR(TIMER2_OVF_vect){ // Прерывания таймера по переполнению
	
	
}

ISR(TIMER2_COMP_vect){ // Прерывания таймера по совпадению

	
}

ISR(ADC_vect){//Прерывание от АЦП
OCR2=(ADC & (1<<ADCH));
asm("sei");
}
	

int main(void)
{
//Подключаем аналого-цифровой преоброзователь.
ADCSRA|=(1<<ADEN);
//Выбор режима преобразования однократное или непрерывное
ADCSRA&=~(1<<ADFR);// однократное
// Разрешение прерывание от АЦП по завершению преобразования.
ADCSRA|=(1<<ADIE); // Запрещаем прерывание.ADIF - флаг прерывания.
//Выбираем тактовую частоту АЦП рекомендуется 50-200кГЦ 
ADCSRA|=(1<<ADPS2)|(1<<ADPS0); //Что соответствует СК/32 = 4Мгц/32=125кГц
//Выбираем бит опорного напряжение относительно которого будет производится замер
ADMUX|=(1<<REFS0); //Выбираем  AVcc, с внешним конденсатором на AREF.
//Определяем как результат преобразования запишется в регистры 
ADMUX|=(1<<ADLAR);// в ADCH записываются старшие  8бит а в младшие 2 бит ADCL
//Выбираем бит аналогового канала на который будет подоватся напряжение для сравнения.
ADMUX|=(1<<MUX0)|(1<<MUX1);// Выбираем ADC3 выход на микроконтролере.

DDRB|=(1<<PB3);  
ADCSRA|=(1<<ADSC);
asm("sei");


	
	
    while(1)
    {
 //Задаем данные для сравнения они влияют на величину импульса. 	
	
   asm("nop");     //TODO:: Please write your application code 
    }
}

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 07:01:40
ARV
во-первых, sei() вы зачем-то вставили в обработчик прерывания АЦП - зачем?
во-вторых, режим АЦП зачем-то изменили на однократный. у вас был правильный режим, но для того, чтобы оно начало измерять, надо ж его запустить первый раз установкой бита ADSC - я ж вам об этом писал "не хватает".
в-третьих, зачем asm("sei") если есть просто sei();?

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 07:29:19
strengerst
Спасибо многое не знал. Про запуск особенно . Буду пробовать.

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 07:31:19
ARV
strengerst писал(а):многое не знал. Про запуск особенно
читайте даташиты :) как говорил О.Бендер, они еще иногда сеют разумное, доброе, вечное...

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 10:07:24
strengerst
Спасибо все получилось. Слишком много информации без практики - каша в голове. При чтении даташита многое упускаю так как там куча инфы и вся она нужна, а практики мало. И еще не всегда все понятно . Спасибо форуму и всем вам что уделяете время на розяснение.

Добавлено after 2 hours 4 minutes 5 seconds:
Куда лучше подключать бит опорного напряжения через AREF или AVcc. В чем вообще разница не пойму.

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 10:24:48
ARV
strengerst писал(а): В чем вообще разница не пойму
как же, разница есть!
VCC - это питание, вся бяка, что там может быть (например, из-за нестабильного питания или скачков нагрузки) попадет на АЦП и ухудшит качество его работы.
AREF - это вход как бы внешнего источника опорного напряжения, но гораздо лучше использовать встроенный источник опоры, а на AREF поставить конденсатор, в соответствии с рекомендациями даташита. не забудьте и про AVCC (если он есть, конечно), - питание на него следует подавать через LC-фильтр, опять же, в соответствии с даташитом.

встроенный источник опорного напряжения обеспечит гораздо лучшее качество работы АЦП.

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 12:18:51
ozonn
strengerst писал(а):Спасибо все получилось. Слишком много информации без практики - каша в голове. При чтении даташита многое упускаю так как там куча инфы и вся она нужна, а практики мало. И еще не всегда все понятно . Спасибо форуму и всем вам что уделяете время на розяснение.

Добавлено after 2 hours 4 minutes 5 seconds:
Куда лучше подключать бит опорного напряжения через AREF или AVcc. В чем вообще разница не пойму.
я использую AVcc. Так удобнее, поскольку потенциометр подключен к тому же AVcc. Т.е. при изменении напряжении от 0 до AVcc, ADCH меняется от 0 до 255

Добавлено after 2 minutes 31 second:
ARV писал(а): встроенный источник опорного напряжения обеспечит гораздо лучшее качество работы АЦП.
strengerst-у не надо измерять напряжение. Ему надо управлять яркостью светодиода, насколько я понял. Точность для него - дело 25-е

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 12:23:05
ARV
ozonn писал(а):strengerst-у не надо
моё дело посоветовать :))) а пользоваться советом или нет - его дело

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 12:27:40
strengerst
Спасибо теперь вроде понял что при использовании Avcc, при правильном подключении через LC фильтр, в отличии от внешнего источника питания подключенного к Aref, меньше помех и более высокая точность измерения.

Re: AVR studio в вопросах и ответах

Добавлено: Пт дек 23, 2016 12:39:27
ARV
strengerst писал(а):в отличии от внешнего источника питания подключенного к Aref, меньше помех и более высокая точность измерения
к сожалению, это не совсем так.
во-первых, к AREF не нужно подключать VCC - смысла нет, питание и изнутри кристалла можно подать в качестве опорного напряжения
во-вторых, и это главное, точность и стабильность встроенного источника опорного напряжения лучше, чем VCC, но может быть гораздо хуже, чем внешнее опорное напряжение! так что для самого лучшего результата следует подключать именно внешний высокостабильный источник опорного напряжения.