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

Вопросы от начинающих по МК


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

On 4/27/2020 at 4:48 PM, Андрей Протаскин said:

и сами попробуете написать код для LCD дисплея и загрузить его в Proteus

А зачем ему пробовать, он это умеет.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, Андрей Протаскин сказал:

чтобы он через тимвивер мне помог

 

2 часа назад, Андрей Протаскин сказал:

почему?

Потому, что я не вижу в этом смысла. Вы не разобрались с тем, почему у вас н мигали светодиоды в предыдущем проекте - то, что в тут сказали в качестве объяснения, ответом быть не может, это заблуждение. А истинная причина проблем осталась неизвестной.

То же самое будет и с новым вопросом: я вам сделаю рабочи пример, вы на него начнете навешивать свою "рюшечки", а когда снова станете в тупик, снова будете просить "через тимвьюер" вам помочь. Я не вижу, что вы стремитесь к пониманию, а дрессировкой я заниматься не хочу. Я могу помочь думать, а не думать - это вы сами справляйтесь.

Вот такое я говно, извините.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Добрий день,
Делаю вольтамперметр с градусником.
Это уже второе устройство. Первым был вольтметр на семисегментных индикаторах удалось добиться хорошей точности.
На этот раз делаю на LCD HD44780, решил попробовать внутреннее опорное напряжение самого МК
Мне показалось что это удобно и с опорным 2,5V можно добатись большей точности  чем от 5V.
AVCC соединил к 5V на AREF конденсатор 0,1 мкф к GND.
Напряжение подаю через потенциометр
Частота 8мгц.
Среда Atmel Studio.
В основном цикле раз в несколько миллисекунд вызываю adc_conv()
Я не понимаю почему но очень большая нелинейность значений с АЦП
например:

1,3v   ADC = 26       (26 / 1,23 = 20)

2,5v   ADC = 72       (72 / 2,5 = 28,8)

4,2v   ADC = 143     (34,04)

5,1v     ADC = 176   (34,5)

6,4v   ADC = 232     (36.25)

14v   ADC = 537      (38,3)

Почему так?

Инициализация ADC:

void adc_init ()
{
	DDRC &= ~(1<<0); //ADC port init PC0
	DDRC &= ~(1<<1); //ADC port init PC1
	DDRC &= ~(1<<2); //ADC port init PC2
	//DDRC &= ~(1<<3); //adc port init PC3
	//DDRC &= ~(1<<4); //adc port init PC4
	//DDRC &= ~(1<<5); //adc port init PC5
	
	ADCSRA |= (1<<ADEN) //ADC enable
	|(1<<ADPS2) |(1<<ADPS1) |(1<<ADPS0) ; //prescaler 128
	
	ADMUX |= (1<<REFS1) |  (1<<REFS0);  //Internal 2.56V Voltage Reference with external capacitor at AREF pin
	
	MCUCR |= (1<<SM0); //ADC Noise Reduction
	
	//ADMUX &= 0b11110000; ADMUX |= 0b00000101;
	ADMUX &= 0b11110000;
}

Функция чтения значений ADC:
 

unsigned int adc_conv (){
	/*
	#define adcinp0 ADMUX &= 0b11110000; //clear last 4 bytes
	#define adcinp1 ADMUX &= 0b11110000; ADMUX |= 0b00000001
	#define adcinp2 ADMUX &= 0b11110000; ADMUX |= 0b00000010
	#define adcinp3 ADMUX &= 0b11110000; ADMUX |= 0b00000011
	#define adcinp4 ADMUX &= 0b11110000; ADMUX |= 0b00000100
	#define adcinp5 ADMUX &= 0b11110000; ADMUX |= 0b00000101
	*/
	/*
	switch (adc_channel){
		case 0 : adcinp0;
		case 1 : adcinp1;
		case 2 : adcinp2;
		case 3 : adcinp3;
		case 4 : adcinp4;
		case 5 : adcinp5;
	}
	*/
	ADCSRA |= (1<<ADSC); //start convert
	while ( ADCSRA & (1<<ADSC) );
	return (unsigned int) ADC;
}
int main(void)
{
	cli();	
	PORTD=0x00;
	DDRD=0xFF;
	//USART_Init (103);
	LCD_ini();
	//clearlcd();
	timer0_init();
	//clearlcd();
	sei();
	clearlcd();
	adc_init();
	//adc_choose_channel(0);
	
	ADMUX &= 0b11110000;
	
	while(1){

		if (ldccadr < 1000){
			ldccadr++;
		}
		else{
			ldccadr = 0;
			setpos(0,0);
			lcd_print_num(adc0);}

		now_time = millis();
		if (now_time - prev_time > 200 ){
			prev_time = now_time;
			adc0 = adc_conv();
		}
	}
}

 

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

35 минут назад, Vit@lik сказал:

почему но очень большая нелинейность значений с АЦП

наверно потому что после переключения канала АЦП нужно сделать паузу для правильного напряжения на CHOLD

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Vit@lik сказал:

Напряжение подаю через потенциометр

не знаю как вы это там подаете... но думаю это будет полезно к прочтению https://forum.cxem.net/index.php?/blogs/entry/317-точный-делитель-из-неточных-резисторов-и-грабли-при-применении-резистивных-делителей/

 

Ссылка на комментарий
Поделиться на другие сайты

 

14 минут назад, IMXO сказал:

не знаю как вы это там подаете


через многооборотный переменный резистор, использую как делитель на нелинейность не влияет,
я им добился чтобы при 24вольтах напряжение на порту было не более 2,5вольта, и больше его не кручу

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

13 минут назад, snn_krs сказал:

Какой номинал у переменного резистора ? Поставьте другой и сделайте теже измерения.

я переминик не крутил.
Я подавал напряжение с лабораторного блока питания.

 

Screenshot_3.png

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

тогда где-то вы обманываете...

24в/2,5в=9.6 - коэф. делителя.  2,5/1023 = 0,00244в одна дискрета АЦП

1,3в/9,6= 0,1354в /0,00244в=55 дискрет в пост1 у вас их почти в два раза меньше 26

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Vit@lik сказал:

чтобы при 24вольтах напряжение на порту было не более 2,5вольта,

 

7 минут назад, IMXO сказал:

24в/2,5в=9.6 - коэф. делителя

чтобы было не больше 2.5, это примерно а не точно что на входе 24в а на выходе 2.5В.
Я не понимаю почему интерес вызывает имено делитель. У него коэффициент деления будет одинаковым вне зависимости от напряжения 1воль или 24в.
Я думал ошибка может в инициализации АЦП ... в коде ... программная

Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Vit@lik сказал:

Функция чтения значений ADC:

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

unsigned int adc_conv (unsigned char adc_chanel){
	ADMUX = (ADMUX & 0xF0) | (adc_chanel & 0x0F);
	ADCSRA |= (1<<ADSC); //start convert
	while ( ADCSRA & (1<<ADSC) );
	return (unsigned int) ADC;
}

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, ARV сказал:

Неужели нельзя было так сделать:

можно конечно, но мне еще не хватает знаний.  Написание таких конструкций отнимает много времени. Поэтому сначала делаю по простому.
Кстати у меня моя функция с таким выбором канала АЦП работала плохо.
это причина почему define і case закомментированные
вписал вашу конструкцию,

unsigned int adc_conv (int adc_chanel){
ADMUX = (ADMUX & 0xF0) | (adc_chanel & 0x0F);
...

работает. спасибо
 

17 часов назад, IMXO сказал:

тогда где-то вы обманываете...

24в/2,5в=9.6 - коэф. делителя.  2,5/1023 = 0,00244в одна дискрета АЦП

1,3в/9,6= 0,1354в /0,00244в=55 дискрет в пост1 у вас их почти в два раза меньше 26

Не знаю в чем была ошибка.
проверил делитель на переменном резисторе по входу  посчитал коэффициент
коефицинт деления 0.105
Написал новий ф-ю
теперь работает спасиобо

void voltmetr_f(){	
	adc0calc = (adc0*0.0025) / 0.105; //num before dot
	
	adc0dotcalc = ( (adc0*0.0025)/0.105 ) *10 ;
	adc0dotcalc = adc0dotcalc % 10; //num after dot
}//vf

Теперь меряет нормально. Ошибка измерений не большая.

Теперь делаю измерения тока (использую ACS712).

Еще есть две проблемы:
1.Почему цифры на экране (HD44780 0802 с Китая) мелькают будто полоски горизонтальные. Особенно если смотреть под углом сверху.

Тут код обновления экрана (частота МК 8Мгц)

		if (ldccadr < 1000)
			{ldccadr++;}
		else{
			ldccadr = 0;
			setpos(0,0);
			lcd_print_num(adc0calc);
			setpos(2,0);
			sendchar(',');
			setpos(3,0);
			lcd_print_num(adc0dotcalc);
			setpos(0,1);
			lcd_print_num(adc1calc);
		}//if acadr
void lcd_print_num (int num) 
{
		static int dig1, dig2, dig3, dig4, val = 0;
		val = num;
		
			if (val < 10){
				sendchar((unsigned char) val +0x30);
				sendchar((unsigned char) " " +0x30);
				sendchar((unsigned char) " " +0x30);
				sendchar((unsigned char) " " +0x30);
			}
			
			else if ((val < 100) && (val > 9)){
				dig1 = val / 10;
				dig2 = val % 10;
...


2.В вольтметра цифра после запятой время от времени то увеличивается то уменьшается на единичку. То есть например
1.21 _1.20 _1.21_1.22_1.21...
Пробовал делать 5-10 измерений а потом искать среднее арифметическое
значительной разницы не заметил

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

ПодскажитеПодскажите, пожалуйста. МК Аттини 45. PB1 и PB2 натраиваю на выход- DDRB |=(1<<1)|(1<<2); . Мне нужно, чтоб на них был ноль. PORTB &=~((1<<1)|(1<<2)); НО в момент подачи питания на микроконтроллер, и именно в момент, когда эти пины устанавливаются на выход, на них проскакивает короткий импульс напряжения. Что это значит и как это победить?

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Гость Жека сказал:

НО в момент подачи питания на микроконтроллер, и именно в момент, когда эти пины устанавливаются на выход, на них проскакивает короткий импульс напряжения. Что это значит и как это победить?

Если это переходный процесс при запуске МК, то вряд ли что-то простое можно посоветовать. Для начала покажите схему реального устройства, где этот всплеск проявляется, а там посмотрим, как быть.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

@ARV Здравствуйте! Может давайте я вам скину тимвивер, а то я не понимаю в LCD дисплее, вроде же код написал правильно,а белый экран и все.

Ссылка на комментарий
Поделиться на другие сайты

Показывайте, что написали, тут, будем разбираться.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...