В рабочем цикле происходит сравнение двух сигналов. Если один сигнал больше другого, то на выходе GPIOA0 = 0, GPIOA1 = 1; если меньше, то GPIOA0 = 1, GPIOA1 = 0. Сравнение происходит с введением коэффициентов усиления (множители с плавающей точкой) каждого сигнала. Переключение состояний порта - с учётом некоторого гистерезиса (с плавающей точкой).
#define Ki = -1.5, // Коэффициент усиления по току
#define Ku = 0.75, // Коэффициент усиления по напряжению
#define Kgist = 0.25, // Гистерезис в компараторе
char K = -1;
float CompA_in1, // 1-й вход компаратора
CompA_in2; // 2-й вход компаратора
unsigned int Ua_ADC,
Ia_ADC;
while(1)
{
Ua_ADC = AdcRegs.ADCRESULT0 >> 6; // АЦП работает постоянно, на максимальной частоте без прерываний. В рабочем
Ia_ADC = AdcRegs.ADCRESULT1 >> 6; // цикле текущие значения АЦП считываются в Ua_ADC и Ia_ADC.
CompA_in1 = Ki * Ia_ADC; // Приведение сигналов (масштабирование)
CompA_in2 = Ku * Ia_ADC; // перед подачей в компаратор.
switch(K) // Компаратор с гистерезисом
{ case (1):
{if (CompA_in1 > (CompA_in2 + Kgist)) K = -1;
GpioDataRegs.GPACLEAR.bit.GPIOA0 = 1;
GpioDataRegs.GPASET.bit.GPIOA1 = 1;
break;}
case (-1):
{if (CompA_in1 <= (CompA_in2 - Kgist)) K = 1;
GpioDataRegs.GPACLEAR.bit.GPIOA1 = 1;
GpioDataRegs.GPASET.bit.GPIOA0 = 1;
break;}
}
}
Решая задачу “в лоб”, как приведено выше, я столкнулся с проблемой очень низкой частоты рабочего цикла. Эта проблема, судя по всему, заключается в неправильном распределении кода в памяти. В связи с этим возникли следующие вопросы:
1. Каким образом в файле компоновки F2812.cmd распределить память (RAM и FLASH) между секциями, чтобы получить наибольшую скорость этого рабочего цикла?
2. В дальнейшем в этом проекте будут создаваться функции, содержащие математические вычисления (фильтры, регуляторы). Необходимо, чтобы эти функции работали в RAM. Каким образом их следует описывать в исходнике кода и в файле компоновки F2812.cmd?
Народ, подскажите, пожалуйста, как с этим бороться.
__________TMS320F2812.rar