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

Дмитрий Вас

Members
  • Постов

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

  • Посещение

Весь контент Дмитрий Вас

  1. теперь такой вопрос. измерение тока хочу сделать с помощью усилителя в микроконтроллере. не понятен алгоритм работы, в дш не нашел описания. все что я понял так это: обнулем канал, задаем канал, запускаем преобразование, получаем результат, и последовательно выполняется преобразование по каналам. //вычисляем значение напряжения unsigned int voltage_dimension(unsigned char channel) { static unsigned long int value; Start_conv_channel(channel); while((ADCSRA & (1<<ADSC)));// ждем окончание преобразования АЦП value = ADC; volt = value*500>>10; return volt; } //вычисляем значение тока unsigned int current_dimension (unsigned char channel) { static unsigned long int value; Start_amplified_conv_channel(channel); while((ADCSRB & (1<<ADSC)));// ждем окончание преобразования АЦП value = ADC; amper = value*100>>10; return amper; } #define Start_amplified_conv() (ADCSRB |= (1<<ADSC) )//стр 253 дш (- By setting the ADSC (ADC Start conversion) bit in the ADCSRB register on AT90PWM2B/3B.) #define Start_amplified_conv_channel(channel) (Select_adc_channel(channel), Start_amplified_conv() ) может нужно каждый раз останавливать измерение? #define Stop_amplified_conv() (ADCSRB &= ~(1<<ADSC) )
  2. все нашел причину, сам дурак... на опорное приходит 4в вместо 5
  3. @COKPOWEHEU хорошая идея. ацп выдал при 3,3в 830 а должен был 676. выходит что и те 5в он показывал скорей просто что больше не мог. спасибо есть о чем думать
  4. Сейчас времени совсем не хватает. Попробовал сдвиг: ADC*500>>10; При 5в получил 499, это меня устраивает. Но при 3,3в так же 400. Так это уже без деления! Остатков нет! Чтобы округлять. Отладка всего не доступна на моем камне. Пробовать только кусок кода на другом камне смысла не вижу. Попробую другой канал АЦП и сделать через другую переменную которую изначально приравнять к нулю. u_int a=0; a=ADC; a*500>>10;
  5. гениально. просто и гениально. частота 62кгц, получается по расчетам или вы имеете ввиду среднее высчитать?
  6. @dasZebraвсе равно мои вычисления так не проходят. В моем случае я получаю результат 400. @mail_robotЯ вывожу поразрядно с виртуальной точкой. Я получаю 500 и вывожу на экран 50,0 чтобы предел был 50 вольт. Я должен получить число 330 вывести на экран 33,0 при 3,3 вольтах на входе. Такая задумка. Но получаю 400. И не укладывается в голове в каком месте идёт округление.
  7. Я в курсе что целочисленная отбрасывает остаток. Но... ADC= 330*1023/500= 675,18 округляем до целочисленного 675. Теперь идём от обратного. Vin = 675*500/1023= 329,9 округляется до целочисленного 330. По любому 3,3 вольта должно выдать. Видимо я не до конца понимаю как работают эти переменные.
  8. Вроде бы все ясно и понятно мне с переменными. Честно не понятно что не так?
  9. @MechanicV пока на авр, смотрел в сторону стм32 но меня питон зацепил, со своим машинным зрением и машинным обучением
  10. интересен процесс, да. не профессионально конечно, но весьма интересно
  11. и все же. при 5в получаю 500, при 3,3в получаю 400. использовал и 8 бит и 10 бит, все равно одинаково. unsigned int ADC_voltage_result(unsigned long int value) { volt = value*500/1023; return volt; } unsigned int volt; вопрос почему округляет?
  12. теперь другая проблема, измеряет пару секунд (цифры меняются) и останавливается. while (1)// это в основном цикле { lcd_gotoxy(0,0); lcd_chisla(ADC_voltage_result(ADC_read(5))); }
  13. unsigned int это от 0 до 65535, что туда не влазит? Все... Дошло. В милливольтах!
  14. они у меня все unsigned int, причем и функции принимают такие "форматы"
  15. но она у меня unsigned int volt;//измеренное напряжение аааа у меня значение ацп 8бит
  16. ставлю вот так volt = value*500/255; получаю 242 ставлю так volt = value*50/255; получаю 50 что за нах?
  17. Что бы определять где мы находимся нужно правильно посчитать. Какое значение будет соответствовать 5в и исходя из этого считать.
×
×
  • Создать...