[an error occurred while processing this directive]
|
получил ТЗ, разработал программу - снимает обороты от датчика и выставляет угол,-но проблема - нет синхронизации оборота и угла,
то биш "угол" (РСА) болтается, а должен стоять относительно "60-2"
ВМТ, устройство подает на две свечи, две искры -180 град и 360 град
разработал эмулятор движка "60-2"генератор прямоуг импульсов с 2 отсутствующими импульсами (он работает исправно -проверял по осциллографу от 250ГЦ-8КГЦ), и плата Cygnal c8051f010.
осциллограф двулучевой - луч от РСА болтается относительно оборотов,
Так как чайник полный и срок разработки прошел( мне интересно в чем проблема , для начинающего это важно понять - для дальнейшей работы , - прилагаю исходник, могу выслать имитатор "60-2".исходник,
Заранее спасибо!!!
С уважение Дима !!!
/********************************************/
/*ПРОГРАММА ОПЕРЕЖЕНИЯ УГЛА ЗАЖИГАНИЯ ДЛЯ */
/* ДВИГАТЕЛЯ ВНУТРЕННЕГО СГОРАНИЯ НА */
/* KIT ФИРМЫ CYGNAL C8051F010-TB */
/********************************************/
/************************ Headers Files *********************************/
#include data union /********************************** таблица в ПЗУ ********************************/ data union data union data union data union { } data union { } data bit Lg,flag_delay ; // вспомогательная переменная sbit Fire1 = P0^1; // Fire : "1" = ON ;"0" = OFF void main (void) delay_cv.w = 100; // длительность исркы TMOD = 0x01; /******************** WatchDog *************************/ WDTCN = 0xde; // watchdog disable /************************** Crossbar and GPIO ******************************/ XBR1 = 0x04; // P0.0 input INT0 as Open-Drain Output/Input 17 pin on board /****************** PCA init *********************/ OSCXCN = 0x10; // Internal oscillator 16 МГц EX0 = 1; ET0 = 1; /************************** Фоновая программа *********************/ } period.b[1] = TH0; TH0 = TL0 = 0; /******************************************** Module 1 ***************************************/ } /************************************ End of Interrupts ***************************************/
E-mail:
info@telesys.ru
#include
{
unsigned int w;
unsigned char b[2];
}
period; // период импульса
unsigned int code x[10]={133,142,166,200,250,333,500,1000,2000,3333};
unsigned int code y[10]={3990,4260,4980,6000,7500,9990,15000,30000,60000,99990};
unsigned int code z[10]={7980,8520,9960,12000,15000,19980,30000,60000,120000,199980};
/********************************************************************************/
/********************************* Unions ****************************************/
{
unsigned int w;
unsigned char b[2];
}
cvecha1; // свеча 1
{
unsigned int w;
unsigned char b[2];
}
cvecha2; // свеча 1
{
unsigned int w;
unsigned char b[2];
}
delay_cv; // длительность искры 100 мкс
unsigned int w;
unsigned char b[2];
var_PCA0; // для хранения значения модуля PCA0
unsigned int w;
unsigned char b[2];
var_PCA1;// для хранения значения модуля PCA1
/****************************** Variables and bits init ************************/
unsigned char i; // переменная индекса массива
unsigned char mask ; // переменная для маскирования
/*********************** Port0 ******************/
sbit Fire2 = P0^2;
/*********************** MAIN *********************/
{
Fire1 = 0; // сброс порта P0.1
Fire2 = 0; // сброс порта P0.2
/******************* Timer 0 INIT *****************/
TH0 = 0; TL0 = 0;
TR0 = 1; IT0 = 1;
WDTCN = 0xad;
XBR2 = 0x40; // Enable crossbar and weak pull-ups
PRT0CF = 0x06; // enable P0.1 and P0.2 (Fire) as a push-pull output 18 pin and 15 pin on board
PCA0CPM0 = 0x09; // PCA0 Software Timer Mode with generate an interrupt ECCF0
PCA0CPM1 = 0x09; // PCA0 Software Timer Mode with generate an interrupt ECCF1
PCA0CPH0 = 0; PCA0CPL0 = 0; //сброс регистров модуля сравнения 0
PCA0CPH1 = 0; PCA0CPL1 = 0;//сброс регистров модуля сравнения 1
PCA0CN = 0x00; // STOP PCA Counter/Timer Run Control
PCA0H = 0x00; //clear register PCA
PCA0L = 0x00; // clear register PCA
PCA0CN = 0x40; // PCA Counter/Timer Run Control
PCA0MD = 0x02; // System clock divided by 4
/****************** Oscillator Configuration *********************/
OSCICN = 0x07; // External oscillator disable
/******************Interrupt init ****************/
EIE1 = 0x08; // Enable Programmable Counter Array (PCA0) Interrupt
EA = 1;
while (1)
{
i = 0;
if (period.w < x[0] || period.w > x[9])
{
cvecha1.w = 0;
cvecha2.w = 0;
}
else
{
if(period.w >= x[0] && period.w <= x[9])
{
while ( period.w > x[i] )
i++;
cvecha1.w = y[i-1]+((period.w-x[i-1])*(y[i]-y[i-1]))/(x[i]-x[i-1]);
cvecha2.w = z[i-1]+((period.w-x[i-1])*(z[i]-z[i-1]))/(x[i]-x[i-1]);
}
}
}
/***************************************** Interrupts ************************************/
void int0 (void) interrupt 0 // INT0
{
IE0 = 0; EX0 = 0;
TR0 = 0;
period.b[0] = TL0;
if (Lg == 0)
{
if (period.w > 2 * x[i])
{
Lg=1;
PCA0CN = 0x00;
PCA0L = 0x00;
PCA0H = 0x00;
PCA0CN = 0x40; //вкл PCA
var_PCA0.b[1] = PCA0CPL0 = cvecha1.b[1]; // считали значения модуля Capture/Compare 0 в переменную, и
var_PCA0.b[0] = PCA0CPH0 = cvecha1.b[0]; // присвоили модулу 0 значения переменной свечи 1
var_PCA1.b[1] = PCA0CPL1 = cvecha2.b[1]; // считали значения модуля Capture/Compare 1 в переменнeую, и
var_PCA1.b[0] = PCA0CPH1 = cvecha2.b[0]; // присвоили модулу 1 значения переменной свечи 1
}
}
TR0 = 1; EX0 = 1;
}
void timer0 (void) interrupt 1 // T1 Overflow
{
TF0 = 0; TR0 = 0;
TH0 = TL0 = 0;
}
void PCA0 (void) interrupt 9 // PCA0 interrupt source
{
/******************************************* Module 0 *****************************************/
mask = PCA0CN;
if (mask && 0x01)
{
CCF0 = 0;
if (flag_delay == 0)
{
Fire1 = 1; // установка порта P0.0 в 1
var_PCA0.w += delay_cv.w; // прибавили к регистрам модуля PCA0 Software timer Mode 100 мкс
flag_delay = 1;
}
if (flag_delay == 1)
{
Fire1 = 0 ; // сброс порта P0.0 в 0
flag_delay = 0 ;
}
}
mask = PCA0CN;
if (mask && 0x02)
{
CCF1 = 0;
if (flag_delay == 0)
{
Fire2 = 1; // установка порта P0.1 в 1
var_PCA0.w += delay_cv.w; // прибавили к регистрам модуля PCA0 Software timer Mode 100 мкс
flag_delay = 1;
}
if (flag_delay == 1)
{
Fire2 = 0 ; // сброс порта P0.1 в 0
PCA0CN = 0x00; // STOP PCA Counter/Timer Run Control
PCA0H = 0x00;
PCA0L = 0x00;
flag_delay = 0 ;
Lg = 0; // сброс бита для разрешения начала отсчета "60-2"
}
}
Ответы