roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллер AVR начинающим - общие вопросы

vvk74 » 15 июн 2017, 21:17

//например для ATMEGA48 будет как-то так
//РВ1 (ОС1А) надо сконфигурировать на выход
ICR1=0x270F; //записываем верхнее значение счетчика 9999 для 10 мс периода
TCNT1=0; //сбрасываем таймер
TCCR1A=0x82; //задаем режим работы 14 (fast PWM - TOP ICR1)
OCR1A=0xC8; // записываем длительность импульса 200 (для 200 мкс)
TCCR1B=0x1A; //запускаем с делителем на 8 (для тактовой 8МГц на входе таймера будет 1 МГц) - для 16 МГц значения ICR1 и OCR1A надо увеличить вдвое

Добавлено спустя 18 минут 34 секунды:
void setup() {
// put your setup code here, to run once:
pinMode(9, OUTPUT);
//например для ATMEGA48 будет как-то так
//РВ1 (ОС1А) надо сконфигурировать на выход
ICR1=0x4E1F; //записываем верхнее значение счетчика 9999 для 10 мс периода
TCNT1=0; //сбрасываем таймер
TCCR1A=0x82; //задаем режим работы 14 (fast PWM - TOP ICR1)
OCR1A=0x190; // записываем длительность импульса 200 (для 200 мкс)
TCCR1B=0x1A; //запускаем с делителем на 8 (для тактовой 8МГц на входе таймера будет 1 МГц) - для 16 МГц значения ICR1 и OCR1A надо увеличить вдвоеvvk74

}

void loop() {
// put your main code here, to run repeatedly:

}

проверил на ардуино нано - работает

Re: МикроКонтроллер AVR начинающим - общие вопросы

к561ЛА7 » 16 июн 2017, 10:51

vvk74 писал(а)://например для ATMEGA48 будет как-то так
//РВ1 (ОС1А) надо сконфигурировать на выход
ICR1=0x270F; //записываем верхнее значение счетчика 9999 для 10 мс периода
TCNT1=0; //сбрасываем таймер
TCCR1A=0x82; //задаем режим работы 14 (fast PWM - TOP ICR1)
OCR1A=0xC8; // записываем длительность импульса 200 (для 200 мкс)
TCCR1B=0x1A; //запускаем с делителем на 8 (для тактовой 8МГц на входе таймера будет 1 МГц) - для 16 МГц значения ICR1 и OCR1A надо увеличить вдвое

Добавлено спустя 18 минут 34 секунды:
void setup() {
// put your setup code here, to run once:
pinMode(9, OUTPUT);
//например для ATMEGA48 будет как-то так
//РВ1 (ОС1А) надо сконфигурировать на выход

Спасибо

ICR1=0x4E1F; //записываем верхнее значение счетчика 9999 для 10 мс периода
TCNT1=0; //сбрасываем таймер
TCCR1A=0x82; //задаем режим работы 14 (fast PWM - TOP ICR1)
OCR1A=0x190; // записываем длительность импульса 200 (для 200 мкс)
TCCR1B=0x1A; //запускаем с делителем на 8 (для тактовой 8МГц на входе таймера будет 1 МГц) - для 16 МГц значения ICR1 и OCR1A надо увеличить вдвоеvvk74

}

void loop() {
// put your main code here, to run repeatedly:

}

проверил на ардуино нано - работает

Re: МикроКонтроллер AVR начинающим - общие вопросы

Акелла » 21 окт 2017, 00:27

Делаю контролер нагрева питающийся от липо батареи
подскажите как сделать чтобы при достижении низкого напряжения отключать ардуину (отправить спать) пытался сделать но ничего не выходит.

Код собирал из кусочков, получилось что получилось, главное работает всё кроме контроля низкого заряда батареи.
Собираю все на ардуине нано

Вопрос 2) почему у меня получается слишком шумно на 5V линии. Т.е. не прямая линия на осциллоскопе а синусоида ~ +.- 100мв в районе 5в то же самое если посмотреть на выход с ШИМ периоды квадратные но разной высоты.

Код: Выделить всёРазвернуть
//Voltage monitor website https://create.arduino.cc/projecthub/nickthegreek82/diy-voltmeter-with-arduino-and-a-nokia-5110-display-cc5092?ref=platform&ref_id=424_trending___&offset=49

int counter = 0;
int switchPin = 2;
int PWM_SET;

#define MIN_VOLT = 9.0;

//----PWM_ADJ------
int POT_PIN = A7;
//----PWM_ADJ_END------


//-------led outputs
int LED_GREEN = 5;
int LED_BLUE = 6;
int LED_RED = 7;

float VOLT_MIN;

float voltage = 0.0;
int sensorPin = A1; 
float sensorValue = 0.0f; 
String voltageString ="0.0";
int stringLength = 0;


float vout = 0.0;
float vin = 0.0;
float R1 = 83000.0;
float R2 = 18000.0;




void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(switchPin, INPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
  pinMode(LED_RED, OUTPUT);

}

void loop() {
  //----провека напряжения на входеб если ниже 9В то ничего не делать.
// for (float i = 0; i < voltage; ++i){
//  if (VOLT_MIN < voltage)
//   continue;


//-------------pwm------- https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
pinMode(3, OUTPUT);
// pinMode(11, OUTPUT);



  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);
  TCCR2B = _BV(CS22);
// OCR2A = 0; //pin 11
  OCR2B = (PWM_SET);

/*
 
* Output A frequency: 16 MHz / 64 / 255 / 2 = 490.196Hz
Output A duty cycle: 180 / 255 = 70.6%
Output B frequency: 16 MHz / 64 / 255 / 2 = 490.196Hz
Output B duty cycle: 50 / 255 = 19.6%


Timer output Arduino output  Chip pin  Pin name
OC0A  6
OC0B  5
OC1A  9
OC1B  10 
OC2A  11 
OC2B  3
*/
// --------------pwm end

//---------------------------------pwm adjusts

int PWM_ADJUST, PWM_ADJ;

PWM_ADJ = analogRead(POT_PIN);

PWM_ADJUST = PWM_ADJ / 20;

//---button

//Handle input
int switchVal = digitalRead(switchPin);
if(switchVal == LOW)
{
   delay(500); 
   counter ++;
   //Reset count if over max mode number
   if(counter == 7)
   {
     counter = 0;
   }
}

else

//Change mode
switch (counter) {
case 1:
   PWM_SET = 0;
  digitalWrite(LED_GREEN, LOW);
  digitalWrite(LED_BLUE, LOW);
  digitalWrite(LED_RED, LOW);
   break;

case 2:
   PWM_SET = (50);
  digitalWrite(LED_GREEN, 255);
  digitalWrite(LED_BLUE, 0);
  digitalWrite(LED_RED, 0);
   break;

case 3:
   PWM_SET = (100);
digitalWrite(LED_GREEN, 255);
digitalWrite(LED_BLUE, 255);
digitalWrite(LED_RED, 0);
   break;

case 4:
   PWM_SET = (150);
digitalWrite(LED_GREEN, 0);
digitalWrite(LED_BLUE, 255);
digitalWrite(LED_RED, 0);
  break;
   
case 5:
   PWM_SET = (200);
  digitalWrite(LED_GREEN, 0);
  digitalWrite(LED_BLUE, 255);
  digitalWrite(LED_RED, 255);
   break;
   
case 6: 
  PWM_SET = 254;
  digitalWrite(LED_GREEN, 0);
  digitalWrite(LED_BLUE, 0);
  digitalWrite(LED_RED, 255);
  break;
   
}
 


//----button end


 
  voltage = readVoltage();
 
  Serial.println(voltage);

 
   Serial.println(PWM_SET);
   
  voltageString = String(voltage,1);

  stringLength = voltageString.length();
  displayVoltage(stringLength);
  delay(100);
}
//}


float readVoltage()
{

   sensorValue = analogRead(sensorPin);
   vout = (sensorValue * 5.0) / 1024.0;
   vin = vout / (R2/(R1+R2));
   return vin;
}


void displayVoltage(int length)
{
// switch(length)
  {
   // case 3:  Serial.print(voltageString,14,19); break;
  //  case 4:  Serial.print(voltageString,2,19); break;
  //  default:  Serial.print(voltageString,2,19); break;
  } 
   
}









111.JPG

Re: МикроКонтроллер AVR начинающим - общие вопросы

Dmitry__ » 21 окт 2017, 01:23

Акелла писал(а):Вопрос 2) почему у меня получается слишком шумно на 5V линии. Т.е. не прямая линия на осциллоскопе а синусоида ~ +.- 100мв в районе 5в

Надо сначала ответить на этот вопрос, это ненормально, проверять цепи питания и стабилизатор.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Акелла » 21 окт 2017, 01:36

Dmitry__ писал(а):это ненормально
что то пошло не так и мега испустила дымок, причем только когда повторно подключил к ЛБП. :o линия питания теперь в коротком замыкании.
В первый запуск все работало нормально, ничего не грелось. Так и не понял как это произошло.


П.С. на схеме в середине нарисован конденсатор круглый, на самом деле это пьезодинамик, пока что не установлен.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Dmitry__ » 21 окт 2017, 01:39

А от чего все питалось? Может этот блок питания на помойку?

Re: МикроКонтроллер AVR начинающим - общие вопросы

Акелла » 21 окт 2017, 01:41

БП самодельный, тороид + DPS5015

Re: МикроКонтроллер AVR начинающим - общие вопросы

Dmitry__ » 21 окт 2017, 01:48

Да, я поднял выше взгляд и увидел PCB :)
На PCB есть неоднозначность в виде непроведенного провода, но стабилизатор надо шунтировать конденсаторами по входу и выходу, как можно ближе к ножкам этой микросхемы, да простит меня dimamichev :D

Re: МикроКонтроллер AVR начинающим - общие вопросы

Акелла » 21 окт 2017, 01:52

Там где непроведенные провода там идут перемычки с другой стороны платы, точки соединения нитками обозначены.
На стабилизаторе стоят 4.7uF на 5V и 100nF на входе

Re: МикроКонтроллер AVR начинающим - общие вопросы

Dmitry__ » 21 окт 2017, 02:00

На pcb какой-то бред, ножка gnd стабилизатора lm1085 идет через резистор 10 ом на 1-ю ножку микроконтроллера. Больше никуда не идет, это очень плохо :) схему можна?

Re: МикроКонтроллер AVR начинающим - общие вопросы

Акелла » 21 окт 2017, 11:08

Там нет lm1085, название забыл стереть, стоит mosfet, подключен через 10 ом к выходу D3 а ардуине.

Capture.JPG

Снял ардуину, оказался пробитый 5v регуль, если на него давать питание сразу идет в КЗ, он помер и забрал с собой ардуину(новый регуль выдает 5в, как только поставил ардуину обратно, то сразу ушел в КЗ) вечером попробую поставить новый чип и электролит 100мкф на входе питания.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Dmitry__ » 21 окт 2017, 15:55

Ох ох ох :)
Может лучше было делать на готовых платах? Взять ардуинку про мини и плату ключей на мосфет...

Re: МикроКонтроллер AVR начинающим - общие вопросы

Акелла » 21 окт 2017, 16:07

мне размер важен, старался уменьшить на сколько возможно.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Dmitry__ » 21 окт 2017, 16:26

ардуино про мини меньше :)

Изображение

Re: МикроКонтроллер AVR начинающим - общие вопросы

Angel71 » 21 окт 2017, 18:10

для компактности нужно детали соответствующие подбирать и нормально компоновать. для наглядности
arduinopico.jpg

uduino.jpg

pico.jpg

pico_2.jpg


Rambler\'s Top100 Mail.ru counter