AVR studio в вопросах и ответах
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Подскажите пожалуйста можно ли менять скважность шим сигнала переменным резисторам, что бы значение не фиксированное в коде было. А принимало значение в зависимости от сопротивление скажем резистора в данный момент. Или как правильно это сделать.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...strengerst писал(а):можно ли менять скважность шим сигнала переменным резисторам
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...
Не понимаю как значение сопротивление резистора передать OCR1A. С помощью АЦП как то. Я так думая что контролер должен замерять значение сопротивления и передовать и записывать это значение в переменную с которой можно было бы уже работать.
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: AVR studio в вопросах и ответах
Никакая контра не уйдёт от нас
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Спасибо почитаю.
Re: AVR studio в вопросах и ответах
strengerst писал(а):ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...
Не понимаю как значение сопротивление резистора передать OCR1A. С помощью АЦП как то. Я так думая что контролер должен замерять значение сопротивления и передовать и записывать это значение в переменную с которой можно было бы уже работать.
совершенно верно, через АЦП. Я так управляю скоростью радиоуправляемой машинки. Настраиваю АЦП на 8-ми битный формат, измеряю напряжение и передаю значение ADCH по радио на машинку, а там заношу его значение в OCR
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Спасибо буду пробовать. А значение скорости машинки передаете через USART?
Re: AVR studio в вопросах и ответах
strengerst писал(а):Спасибо буду пробовать. А значение скорости машинки передаете через USART?
нет, через NRF24L01+. Через него надежнее
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Ситуация такая, хочу с помощью АЦП микроконтроллера атmega8 регулировать ШИМ сигнал на транзистор. С ШИМ вроде разобрался
при изменении данных регистра таймера OCR2 мы изменяем скважность сигнала шим и лампочка прикрепленая к транзистору меняет силу свечения. Дальше хочу с помощью переменного транзистора изменять ШИМ сигнал - управлять свечением лампочки. Тут понятно что нужно данные регистра ADCH записывать в OCR2 что бы ШИМ изменялся в зависимости от сопротивления резистора. А как правильно это сделать не знаю. Подскажите в чем я ошибаюсь. Вот схема и код.
при изменении данных регистра таймера 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
}
}- Вложения
-
- схема1.png
- (44.17 КБ) 354 скачивания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
по-моему, у вас в коде не хватает запуска АЦП на первое измерение, т.е. ADCSRA |= _BV(ADSC);
ну и, разумеется, глобального разрешения прерываний sei(); не вижу перед главным циклом
P.S. корректность установки прочих битов в регистрах таймера и т.п. не проверял - путаный код...
ну и, разумеется, глобального разрешения прерываний sei(); не вижу перед главным циклом
P.S. корректность установки прочих битов в регистрах таймера и т.п. не проверял - путаный код...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Спасибо сейчас попробую. 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
}
}- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
во-первых, sei() вы зачем-то вставили в обработчик прерывания АЦП - зачем?
во-вторых, режим АЦП зачем-то изменили на однократный. у вас был правильный режим, но для того, чтобы оно начало измерять, надо ж его запустить первый раз установкой бита ADSC - я ж вам об этом писал "не хватает".
в-третьих, зачем asm("sei") если есть просто sei();?
во-вторых, режим АЦП зачем-то изменили на однократный. у вас был правильный режим, но для того, чтобы оно начало измерять, надо ж его запустить первый раз установкой бита ADSC - я ж вам об этом писал "не хватает".
в-третьих, зачем asm("sei") если есть просто sei();?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Спасибо многое не знал. Про запуск особенно . Буду пробовать.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
читайте даташитыstrengerst писал(а):многое не знал. Про запуск особенно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Спасибо все получилось. Слишком много информации без практики - каша в голове. При чтении даташита многое упускаю так как там куча инфы и вся она нужна, а практики мало. И еще не всегда все понятно . Спасибо форуму и всем вам что уделяете время на розяснение.
Добавлено after 2 hours 4 minutes 5 seconds:
Куда лучше подключать бит опорного напряжения через AREF или AVcc. В чем вообще разница не пойму.
Добавлено after 2 hours 4 minutes 5 seconds:
Куда лучше подключать бит опорного напряжения через AREF или AVcc. В чем вообще разница не пойму.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
как же, разница есть!strengerst писал(а): В чем вообще разница не пойму
VCC - это питание, вся бяка, что там может быть (например, из-за нестабильного питания или скачков нагрузки) попадет на АЦП и ухудшит качество его работы.
AREF - это вход как бы внешнего источника опорного напряжения, но гораздо лучше использовать встроенный источник опоры, а на AREF поставить конденсатор, в соответствии с рекомендациями даташита. не забудьте и про AVCC (если он есть, конечно), - питание на него следует подавать через LC-фильтр, опять же, в соответствии с даташитом.
встроенный источник опорного напряжения обеспечит гораздо лучшее качество работы АЦП.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: AVR studio в вопросах и ответах
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-е
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
моё дело посоветоватьozonn писал(а):strengerst-у не надо
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: AVR studio в вопросах и ответах
Спасибо теперь вроде понял что при использовании Avcc, при правильном подключении через LC фильтр, в отличии от внешнего источника питания подключенного к Aref, меньше помех и более высокая точность измерения.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
к сожалению, это не совсем так.strengerst писал(а):в отличии от внешнего источника питания подключенного к Aref, меньше помех и более высокая точность измерения
во-первых, к AREF не нужно подключать VCC - смысла нет, питание и изнутри кристалла можно подать в качестве опорного напряжения
во-вторых, и это главное, точность и стабильность встроенного источника опорного напряжения лучше, чем VCC, но может быть гораздо хуже, чем внешнее опорное напряжение! так что для самого лучшего результата следует подключать именно внешний высокостабильный источник опорного напряжения.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!