Подскажите пожалуйста можно ли менять скважность шим сигнала переменным резисторам, что бы значение не фиксированное в коде было. А принимало значение в зависимости от сопротивление скажем резистора в данный момент. Или как правильно это сделать.
можно ли менять скважность шим сигнала переменным резисторам
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...
Не понимаю как значение сопротивление резистора передать OCR1A. С помощью АЦП как то. Я так думая что контролер должен замерять значение сопротивления и передовать и записывать это значение в переменную с которой можно было бы уже работать.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
ну а в чем проблема-то? скважность определяется содержимым регистр OCR1A (например), ну так и делайте в нужном месте OCR1A = adc_get_resistor_value();, например, в главном цикле...
Не понимаю как значение сопротивление резистора передать OCR1A. С помощью АЦП как то. Я так думая что контролер должен замерять значение сопротивления и передовать и записывать это значение в переменную с которой можно было бы уже работать.
совершенно верно, через АЦП. Я так управляю скоростью радиоуправляемой машинки. Настраиваю АЦП на 8-ми битный формат, измеряю напряжение и передаю значение ADCH по радио на машинку, а там заношу его значение в OCR
Ситуация такая, хочу с помощью АЦП микроконтроллера атmega8 регулировать ШИМ сигнал на транзистор. С ШИМ вроде разобрался при изменении данных регистра таймера OCR2 мы изменяем скважность сигнала шим и лампочка прикрепленая к транзистору меняет силу свечения. Дальше хочу с помощью переменного транзистора изменять ШИМ сигнал - управлять свечением лампочки. Тут понятно что нужно данные регистра ADCH записывать в OCR2 что бы ШИМ изменялся в зависимости от сопротивления резистора. А как правильно это сделать не знаю. Подскажите в чем я ошибаюсь. Вот схема и код. Спойлер
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 } }
по-моему, у вас в коде не хватает запуска АЦП на первое измерение, т.е. ADCSRA |= _BV(ADSC); ну и, разумеется, глобального разрешения прерываний sei(); не вижу перед главным циклом
P.S. корректность установки прочих битов в регистрах таймера и т.п. не проверял - путаный код...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Спасибо сейчас попробую. ADCSRA|=(1<<ADSC); - Так вроде как это для однократного преобразования, а уменя в коде стоит непрерывное преобразование?
Ну вот исправил на однократное ну все равно что то не так: Все надо идти смогу отписаться только завтра. Если не сложно напишите в чем еще может быть причина Спойлер
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 } }
во-первых, sei() вы зачем-то вставили в обработчик прерывания АЦП - зачем? во-вторых, режим АЦП зачем-то изменили на однократный. у вас был правильный режим, но для того, чтобы оно начало измерять, надо ж его запустить первый раз установкой бита ADSC - я ж вам об этом писал "не хватает". в-третьих, зачем asm("sei") если есть просто sei();?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Спасибо все получилось. Слишком много информации без практики - каша в голове. При чтении даташита многое упускаю так как там куча инфы и вся она нужна, а практики мало. И еще не всегда все понятно . Спасибо форуму и всем вам что уделяете время на розяснение.
Добавлено after 2 hours 4 minutes 5 seconds: Куда лучше подключать бит опорного напряжения через AREF или AVcc. В чем вообще разница не пойму.
как же, разница есть! VCC - это питание, вся бяка, что там может быть (например, из-за нестабильного питания или скачков нагрузки) попадет на АЦП и ухудшит качество его работы. AREF - это вход как бы внешнего источника опорного напряжения, но гораздо лучше использовать встроенный источник опоры, а на AREF поставить конденсатор, в соответствии с рекомендациями даташита. не забудьте и про AVCC (если он есть, конечно), - питание на него следует подавать через LC-фильтр, опять же, в соответствии с даташитом.
встроенный источник опорного напряжения обеспечит гораздо лучшее качество работы АЦП.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Спасибо все получилось. Слишком много информации без практики - каша в голове. При чтении даташита многое упускаю так как там куча инфы и вся она нужна, а практики мало. И еще не всегда все понятно . Спасибо форуму и всем вам что уделяете время на розяснение.
Добавлено after 2 hours 4 minutes 5 seconds: Куда лучше подключать бит опорного напряжения через AREF или AVcc. В чем вообще разница не пойму.
я использую AVcc. Так удобнее, поскольку потенциометр подключен к тому же AVcc. Т.е. при изменении напряжении от 0 до AVcc, ADCH меняется от 0 до 255
Добавлено after 2 minutes 31 second:
ARV писал(а):
встроенный источник опорного напряжения обеспечит гораздо лучшее качество работы АЦП.
strengerst-у не надо измерять напряжение. Ему надо управлять яркостью светодиода, насколько я понял. Точность для него - дело 25-е
Спасибо теперь вроде понял что при использовании Avcc, при правильном подключении через LC фильтр, в отличии от внешнего источника питания подключенного к Aref, меньше помех и более высокая точность измерения.
в отличии от внешнего источника питания подключенного к Aref, меньше помех и более высокая точность измерения
к сожалению, это не совсем так. во-первых, к AREF не нужно подключать VCC - смысла нет, питание и изнутри кристалла можно подать в качестве опорного напряжения во-вторых, и это главное, точность и стабильность встроенного источника опорного напряжения лучше, чем VCC, но может быть гораздо хуже, чем внешнее опорное напряжение! так что для самого лучшего результата следует подключать именно внешний высокостабильный источник опорного напряжения.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения