Помогите придумать формулу по графику

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Ну вы даете.
В Ардуино ИДЕ вот это все удаляем
Спойлер

Код: Выделить всё

void setup() {
  // put your setup code here, to run once:

}

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

}
Пишем это
Спойлер

Код: Выделить всё

// ATtiny13 9.6Mhz int.

#include <avr/io.h>

int main(void)
 { 

CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out 
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0 
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9600,000 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 0,026667 ms
// Output Pulse(s):
// OC0A Period: 0,026667 ms Width: 0 us
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0<<AIN0D) | (0<<AIN1D);

// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

// Bandgap Voltage Reference: Off
ADMUX = 1 | ((0<<REFS0) | (1<<ADLAR));

while (1)
      {
      // Place your code here

// Start the AD conversion
ADCSRA|=(1<<ADSC);
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);

OCR0A =  ADCH;
     
      }

 }
Скетч использует 100 байт (9%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 64 байт для локальных переменных. Максимум: 64 байт.

Мне лень таблицу делать

Код: Выделить всё

unsigned char table_voltage[255]={}
OCR0A =  table_voltage[ADCH];
Реклама
Друг Кота
Сообщения: 7722
Зарегистрирован: Вс июл 24, 2011 11:38:09

Сообщение 74LS00 »

Ой эт вы зря, теперь придётся думать, а я хотел дальше дописать.
Видел форум с подобным разжёвыванием, да всё никак.
Тут стоит начать что вообще эти палочки и стрелочки значат, видел их ещё году в 2009 в kde4, но так нифига и не понял, почему потоки текут против реки и что это вообще.
Я тут вообще офигиваю смотря в блинк из примеров, он на удивление под мегу собирается, а под тиньку не может, в нём просто нет переменной. И такое повсюду, програмисты кидаются кусками кода, а объяснить синтаксис некому, придётся ещё одну книжку покупать, только британские писатели учат начинающих
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Для разрядности 10 бит АЦП потребуется 1024 * 2 байта = 2048 байт флеша, что то же не влазит в отведенный МК.
По этому АЦП был переключен в режим 8 бит, что потребуется всего 256 байт флеша для таблицы.

И так что умеем
Спойлер

Код: Выделить всё

АДЦ		ШИМ
	
0		0
356		5
368		30
760		95
922		205
из курса математики вспоминается уравнение прямой по двум точкам, можно воспользоваться каким нибудь онлайн сервисом, к примеру этим и получить заветные формулы
Спойлер

Код: Выделить всё

АДЦ		ШИМ				
					
0		0			y=0.056179775280898875x+0	
89		5			y=8.333333333333334x−736.6666666666667	
92		30			y=0.6632653061224489x−31.0204081632653	
190		95			y=2.75x−427.5	
230,5	205
ну а далее, ексель как обычно все посчитает, и получим заветную таблицу
Спойлер

Код: Выделить всё

0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,2,2,2,2,2,
2,2,2,2,2,2,2,2,
2,2,2,2,2,3,3,3,
3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,4,
4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,
4,5,5,5,5,5,5,5,
5,5,13,22,30,31,31,32,
33,33,34,35,35,36,37,37,
38,39,39,40,41,41,42,43,
43,44,45,45,46,47,47,48,
49,49,50,51,51,52,53,53,
54,55,55,56,57,57,58,59,
59,60,61,61,62,62,63,64,
64,65,66,66,67,68,68,69,
70,70,71,72,72,73,74,74,
75,76,76,77,78,78,79,80,
80,81,82,82,83,84,84,85,
86,86,87,88,88,89,90,90,
91,92,92,93,94,94,95,98,
101,103,106,109,112,114,117,120,
123,125,128,131,134,136,139,142,
145,147,150,153,156,158,161,164,
167,169,172,175,178,180,183,186,
189,191,194,197,200,202,205,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
осталось эту таблицу встроить в код
Спойлер

Код: Выделить всё

#include <avr/pgmspace.h>

const unsigned char table_voltage[256] PROGMEM ={
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,2,2,2,2,2,
2,2,2,2,2,2,2,2,
2,2,2,2,2,3,3,3,
3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,4,
4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,
4,5,5,5,5,5,5,5,
5,5,13,22,30,31,31,32,
33,33,34,35,35,36,37,37,
38,39,39,40,41,41,42,43,
43,44,45,45,46,47,47,48,
49,49,50,51,51,52,53,53,
54,55,55,56,57,57,58,59,
59,60,61,61,62,62,63,64,
64,65,66,66,67,68,68,69,
70,70,71,72,72,73,74,74,
75,76,76,77,78,78,79,80,
80,81,82,82,83,84,84,85,
86,86,87,88,88,89,90,90,
91,92,92,93,94,94,95,98,
101,103,106,109,112,114,117,120,
123,125,128,131,134,136,139,142,
145,147,150,153,156,158,161,164,
167,169,172,175,178,180,183,186,
189,191,194,197,200,202,205,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0};

OCR0A = pgm_read_byte(&(table_voltage[ADCH]));
Итог:
Скетч использует 364 байт (35%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 64 байт для локальных переменных. Максимум: 64 байт.
Ответить

Вернуться в «AVR»