Перейти к содержанию
    

jeti

Участник
  • Постов

    15
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о jeti

  • Звание
    Участник
    Участник
  • День рождения 26.09.1986

Контакты

  • ICQ
    Array

Информация

  • Город
    Array
  1. Вы меня запутали, мой калькулятор говорит: VCC = ADC*(35/4) = 1*(35/4) = 8.75 VCC = 35*ADC /4 = 35*1/4 = 8.75 VCC = ADC*(35/4) = 1023*(35/4) = 8951.25 VCC = 35*ADC /4 = 35*1023/4 = 8951.25 также само int A = 2; int B = 256; int C = 256; int X = A/B*C = 2/256*256 = 2 int X = C*A/B = 256*2/256 = 2 В чем разница? Так как всетаки правильно?
  2. Спасибо, вычесления понятны /* VСС - ?mV ADC=1023 ---> 9000mV k=9000mV/ADC=9000/1023=8.797 VCC=ADC*k Чтобы не сильно потерять в точности при целочисленной арифметике, подбираем K таким, чтобы дробная часть была как можно меньше, и чтобы MAX(ADC) * K уложилось в unsigned short диапазон. k=k*4=8.797*4=35.188 k=35 VCC=ADC*(35/4) */ и в теории все сходится, а на практике у меня не очень. Хочу уточнить результат ADC это 0-1023 ведь? Вот такой код у меня как пример работы вышел, может что-то где-то не так? А выходит следующие, я указал значение 6100mV и при реальных 6100 +/- там, сходится в теории и в реале, теперь пишу в коде 6000 а срабатывает гораздо ниже где-то на 5000mV. Делитель вроде верный 3300 Ohm к + и 3980 Ohm к земле. /***************************************************** Port Definition PB0 = OUT (0) (PWM) PB1 = IN (Pull Up) (Switch) PB2 = IN (ADC) PB3 = OUT (1) (RED) PB4 = IN PB5 = IN ****************************************************** Hard info Vmax on Batt = 9000mV V on ATTINY13 = 4900mV Vmax on ADC = 4900mV ****************************************************** Chip type : ATtiny13 AVR Core Clock frequency: 9,600000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 16 *****************************************************/ #include <tiny13.h> #include <delay.h> #define ADC_VREF_TYPE 0x00 unsigned int ADC, power_good; unsigned short VCC; void RED_ON (void) {PORTB.3=0;} void RED_OFF (void) {PORTB.3=1;} // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { } // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void BATT_VCC () { ADC = read_adc(1); // 1 - ADC channel /* VСС - ?mV ADC=1023 ---> 9000mV k=9000mV/ADC=9000/1023=8.797 VCC=ADC*k Чтобы не сильно потерять в точности при целочисленной арифметике, подбираем K таким, чтобы дробная часть была как можно меньше, и чтобы MAX(ADC) * K уложилось в unsigned short диапазон. k=k*4=8.797*4=35.188 k=35 VCC=ADC*35/4 */ VCC=ADC*(35/4); } // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=Out // State5=T State4=T State3=1 State2=T State1=P State0=0 PORTB=0x0A; DDRB=0x09; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 9600,000 kHz // Mode: Phase correct PWM top=FFh // OC0A output: Non-Inverted PWM // OC0B output: Disconnected TCCR0A=0x81; TCCR0B=0x01; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Low level // Interrupt on any change on pins PCINT0-5: Off GIMSK=0x40; MCUCR=0x00; GIFR=0x40; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; // Analog Comparator initialization // Analog Comparator: Off ACSR=0x80; ADCSRB=0x00; // ADC initialization // ADC Clock frequency: 75,000 kHz // ADC Bandgap Voltage Reference: Off // ADC Auto Trigger Source: None // Digital input buffers on ADC0: Off, ADC1: Off, ADC2: On, ADC3: Off DIDR0&=0x03; DIDR0|=0x2C; //ADMUX=ADC_VREF_TYPE & 0xff; // dafault generated by CVAVR ADMUX=1|(ADC_VREF_TYPE & 0xff); ADCSRA=0x87; // Global enable interrupts #asm("sei") BATT_VCC (); while (1) { // power_good chek begin BATT_VCC (); if (VCC>6100) { //mV delay_ms(100); if (VCC>6100) { power_good=0; }; } else { power_good=1; }; // power_good chek end if (power_good==0) { RED_ON (); } else { RED_OFF (); }; }; }
  3. Мне нужно измерять напряжение от 0-9V. Делитель токой что при 9V которые надо измерять, на входе АЦП 4.9V, при питании контроллера 4.9V. Я не совсем понял как задать Vref от VCC контроллера, тоесть 4.9V в моем случае. Это оно: #define ADC_VREF_TYPE 0x00 ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); тогда что такое adc_input? Это вход АЦП тоесть в моем случае ADMUX=1 | (ADC_VREF_TYPE & 0xff); При Vref от VCC будет ли работать это: //9000mV on Batt = 4900mV on ADC (4900*1.84 = 9016mV) kv = 1.84 #define VREF 4900 void BATT_VCC () { ADC = read_adc(1); VCC = (ADC*VREF/1023)*kv; } //VCC = (0*4900/1023)*1.84 = 0 //VCC = (1023*4900/1023)*1.84 = 9016 mV В теории вроде верно?
  4. Сабж, а конкретнее: есть VСС=4.90V, подаю на вход АЦП (PORTB.2) через делитель от 0 до 4900mV согласно правилам. Нужен пример где идет постоянное измерение напряжения, и в результате чтоб была конечная переменная со значением в mV. Не понятно: какой Vref, и какие типы данных следует применять. Супер-мега точность не нужна. В CodeVision выставляю вот это (на картинке). Куски кода которые относятся к АЦП: //9000mV on Batt = 4900mV on ADC (4900*1.84 = 9016mV) kv = 1.84 #define ADC_VREF_TYPE 0x00 //(что значит эта строка?) #define VREF 4900 //mV (не знаю нодо ли это, или как правильно?) unsigned int VCC, kv=1.84; //(какой тип данных следует применять?) // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void BATT_VCC () { //vichislenie BATT_VCC (mV) VCC = read_adc(1); // VСС = 0-1024, 1 - nomer kanala ADC VCC = VCC*VREF/1024; VCC = VCC*kv; //(VСС mV) } BATT_VCC (); Это правильно?
  5. ШИМ на MEGA8

    Вы имеете ввиду вот так? Clock Value доступны только вот те значения. А что такое toggle?
  6. ШИМ на MEGA8

    а куда именно и как это правильно записать?
  7. ШИМ на MEGA8

    Приведите пожалуйста пример расчета частоты ШИМ. Использую: MEGA8, внутр. 8mHz, CVAVR. получаю код // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: Fast PWM top=ICR1 // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xA2; TCCR1B=0x19; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; что нужно записать в регистры ICR1H, ICR1L чтобы получить ШИМ с частотой например 1kHz?
  8. Спасибо за наводу, уже подчеркиваю и буду пробовать, без боя не сдамся )))
  9. Это все конечно хорошо вот только цены на эти спец-микрухи кусаются. Да, наверное нефиг изобретать велосипед - стабилизацию тока/напряжения буду делать на понижающих ШИМ контроллерах которые под это и заточены а яркостью управлять ШИМ-ом уже после ШИМ контроллера. Всем спасибо за советы.
  10. Да по этому поводу я вкурсе, уже парочку спалил Красивая подсветка, красота.
  11. Спасибо всем за участие. Я не спец, и конечно не все знаю вот и спрашиваю советов опытных людей, ну а хаеть то всегда самое простое. По теме. Возможно пересмотрю подход и схему, но не все правильно поняли что мне надо, еще раз: Аккум в процессе езды не заряжается, только разряд. По мере разряда напряжение на аккуме падает, падает ток на светодиоде и яркость соответственно будет падать, я хочу вычеслять ток и корректировать ШИМ чтоб по мере разрядки поддерживать постоянныю яркость. Разряд аккума буду определять иключительно по его напряжению. Вот мануал по светодиоду кому интерессно. Ламерское конечно описание но всеже я подумал так: буру 12В цепляю светодиод по схеме подключаю тестер подбераю ШИМ чтоб тестер показывал 0,7А мне казалось так будет работать. В мануале сказано DС Pulse Current (1kHz, 10% duty cycle) max 1.8A. Раз с токами все так страшно буду подавать 4В макс на светодиод. XLamp7090XR_E.pdf
  12. Вот схема. Пока что ШИМ делаю программно, прямоугольные импульсы на выходе, (апп. еще не научился пользовать, може кто покажет пример на С под мегу8 с 8mHz на ШИМ 1kHz то будет мне щастье). Ток мне нужно мерять так как это основной показатель питания светодиодов. ps вообще это вело-фара, котоая будет питаться от 2-3-ох LI-Po аккумов надо следить чтоб не переразрядить их, будет несколько режимов яркости, вычесляя ток и корректируя ШИМ можно будет поддерживать постоянную яркость светодиодов. Вобщем хочется все это сделать мне на одном контроллере, не знаю если кто-то уже знает что это заведомо плохая идея может измерения будут неточными - говорите, тогда буду применять понижающие импульсные стабилизаторы. Аппаратная фильтрация это например сделать 100 выборок и вычеслить среднее значение?
  13. Это выходит фильтр нижних частот, а на какую частоту его нужно расчитывать, если например шим 200Гц и например 1кГц? И само АЦП лучше на какой частоте делать?
  14. ну наверное как минимум десятые, но это грубо будет врядле ток нормально вычислить можно будет значет сотые. Подскажите хоть в каком направлении двигаться, какие и где фильтры нужны, может перед светодиодом надо эти импульсы сглажевать а уже потом и перед АЦП тоже фильтры ставить? Шо делать
  15. Есть мощьный светодиод, управляю его яркостью методом ШИМ через мегу8 и полевик. Надо мерять ток который жрет светодиод. Надо замерить падение напряжение на шунте. С АЦП разобрался работает, когда крутишь переменник - тоесть менять чистое напряжение на АЦП то вычесляет верно, когда пытаюсь мерять напряжение на концах шунта во время работы ШИМ, то считает не верно, думаю это связано с пульсациями из-за ШИМ. Вопрос: как нормировать сигнал перед АЦП, какие фильтры применять, если б привели конкретные параметры, схемы, я в этом не силен вот и спрашиваю. Параметры схемы: Макс напряжение 12В, светодиод жрет 1А макс., шунт 0,333Ом на + перед светодиодом. ШИМ планирую от 200Гц до 1кГц. Вобщем подскажите шото, пожалуйста.
×
×
  • Создать...