Re: Генератор работы форсунок инжекторного двигателя
SBorovkov, спасибо. Реально подумал про avr studio, может тогда меньше будет тупых вопросов, но я тогда точно уйду от ардуины и процесинга :).
Сегодня наткнулся на пример с таймерами и там, прикольнула меня работа с avr studio. Сегодня - перезагрузка, avr studio начну пробовать. :)
Re: Генератор работы форсунок инжекторного двигателя
ардуину (саму плату) можно с удобством использовать как отладочную плату, особенно в сочетании с макетной платой с пружинными контактами.
Как запустить проект arduino среды в avr studio, я писал тут:
http://www.compcar.ru/forum/showthread.php?t=5910
Как зашить полученную прогу в arduino:
У меня среда arduino шьет следующей строкой:
E:\arduino-0021\hardware\tools\avr\bin\avrdude -CE:\arduino-0021\hardware/tools/avr/etc/avrdude.conf -q -q -patmega168 -cstk500v1 -P\\.\COM8 -b19200 -D -Uflash:w:c:\Temp\build4629811770678680876.tmp\sket ch_dec17a.cpp.hex:i
Поменяться в этой строке кроме путей могут:
-patmega168 это тип контроллера. В моем случае atmega168
-P\\.\COM8 - номер ком порта
Сам проверить не могу, поскольку сразу по получении заменил родной бутлоадер на другой, а перешивать туда-сюда его лень.
В avr studio тебе ничто не мешает по началу писать используя библиотеки arduino. Потом, я бы порекомендовал обратить внимание на библиотеку доступа к ногам контроллера. Супер библиотека. И ею можно пользоваться даже не понимая как она устроена.
тут описание http://easyelectronics.ru/rabota-s-p....html#more-339 . Можешь особо не разбираясь и не читая (если сложно) сразу в конце статьи скачать библиотеку. Там есть пара примеров к ней, сразу поймешь как пользоваться.
Единственное, в этой библиотеке оперируют не номерами контактов arduino платы, а стандартными портами avr контроллеров.
Соответствие можно посмотреть в файле
E:\arduino-0017\hardware\cores\arduino\pins_arduino.c
Если у тебя 1280 или 2560
// 0-7 PE0-PE7 works
// 8-13 PB0-PB5 works
// 14-21 PA0-PA7 works
// 22-29 PH0-PH7 works
// 30-35 PG5-PG0 works
// 36-43 PC7-PC0 works
// 44-51 PJ7-PJ0 works
// 52-59 PL7-PL0 works
// 60-67 PD7-PD0 works
// A0-A7 PF0-PF7
// A8-A15 PK0-PK7
Re: Генератор работы форсунок инжекторного двигателя
Вот код, который я тестировал в avr studio на предмет работы таймера
Код:
#include <avr/version.h>
#include <avr/io.h>
#include <avr/interrupt.h>
uint8_t tcnt2;
int main(void)
{
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
TCCR2B &= ~(1<<CS22); // эта и следующая строка задает таймер увеличение TCNT2 каждые 32 такта.
TCCR2B |= (1<<CS21) | (1<<CS20);
tcnt2 = 251; // 32 такта* (256-251)=160 тактов. То есть каждые 10 мкс.
TCNT2 = tcnt2;
sei();
for (;;);
}
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2;
}
Re: Генератор работы форсунок инжекторного двигателя
Спасибо за советы.
В понедельник утром остановился на варианте ниже
PHP код:
#define D22_High PORTA |=B00000001
#define D22_Low PORTA &= B11111110
volatile byte set[7] ;
volatile unsigned int tcnt2 = 206; //32 такта делителя * (256-206)=1600 тактов. То есть каждые 0,1 мс.
volatile unsigned int var = 1 ;
volatile byte pwm_time = 0 ;
void setup()
{
pinMode(22, OUTPUT);
pinMode(2, OUTPUT); // Давление топлива
pinMode(3, OUTPUT); // Давление в коллекторе
pinMode(4, OUTPUT); // Температура топлива
pinMode(5, OUTPUT); // Температура двигателя
TIMSK2 &= ~(1<<TOIE2);
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
TCCR2B &= ~((1<<WGM22) | (1<<CS22));
TCCR2B |= ((1<<CS21) | (1<<CS20));
ASSR &= ~(1<<AS2);
TIMSK2 |= (1<<TOIE2);
Serial.begin(9600);
}
void loop()
{
if(Serial.available() > 7)
{
if(Serial.read() == 255)
{
for(int i = 0; i < 7; i++)
{
set[i] = Serial.read(); // set[0] - Длительность импульса впрыска, Длительность паузы = set[1] + set[2] * 250
}
}
}
analogWrite(2, set[3]); // Давление топлива
analogWrite(3, set[4]);
analogWrite(4, set[5]); // Температура топлива
analogWrite(5, set[6]); // Температура двигателя
}
//************* прерывание *************
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2;
switch (var)
{
case 1:
pwm_time++;
if(pwm_time < set[0]) D22_High;
else
{
pwm_time=0;
var = 2 ;
}
break;
case 2:
pwm_time++;
if(pwm_time < set[1]) D22_Low;
else
{
if (set[2] > 0) var = 3; else var = 1;
pwm_time=0;
}
break;
case 3:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 1) var = 4; else var = 1;
pwm_time=0;
}
break;
case 4:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 2) var = 5; else var = 1;
pwm_time=0;
}
break;
case 5:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 3) var = 6; else var = 1;
pwm_time=0;
}
break;
case 6:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 4) var = 7; else var = 1;
pwm_time=0;
}
break;
case 7:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 5) var = 8; else var = 1;
pwm_time=0;
}
break;
case 8:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 6) var = 9; else var = 1;
pwm_time=0;
}
break;
case 9:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 7) var = 10; else var = 1;
pwm_time=0;
}
break;
case 10:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 8) var = 11; else var = 1;
pwm_time=0;
}
break;
case 11:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 9) var = 12; else var = 1;
pwm_time=0;
}
break;
case 12:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
if (set[2] > 10) var = 13; else var = 1;
pwm_time=0;
}
break;
case 13:
pwm_time++;
if(pwm_time < 250) D22_Low;
else
{
pwm_time=0;
var = 1;
}
break;
}
}
Увеличил делитель и с точностью до 0.1 мс запустил. Провозился с командой For в таймере, но так и не понял где ошибаюсь, сделал тупо на Case и собрал в корпус.
Подскажите как лучше работать с двух-байтовыми значениями?
p.s. И еще при измерении реального импульса есть ошибка в 10 мкс, т.е. вместо 10,0 мс получается 9,99 мс, при 10,1 получается 10,09 мс и т.д.
Есть ли вариант добавить 0,01 мс ?
Re: Генератор работы форсунок инжекторного двигателя
А почему бы тебе не сократить время обмена с компьютером , всего то изменить скорость обмена на 115200
Re: Генератор работы форсунок инжекторного двигателя
Ставил и так и так Разницы не заметил в работе, но более высокая скорость чревата перебоями от помех, а их у меня на СТО - просто кошмар. :)