dev(UML-2579): В тестовое окружение sdfm добавлен CLA модуль. Даннный код имеет ознакомительный характер т.к программа озврпщает указатель на нулевой адресс при первомже прерывании.
This commit is contained in:
parent
9077ce62ff
commit
6a297b55eb
32
README.md
Normal file
32
README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# SDFM_CONTROL
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Данный проект представляет собой переработанный проект MotorControlModuleSDFM_TMS320F28388D написаный с целью тестирования измененых параметров модуля SDFM а также тестирования его взаимодейсвия с CLA .
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Проект разделен на два программных модуля:
|
||||||
|
|
||||||
|
* Модуль инициализации `epwm_test_biss_c_cpu1` и предоставляет собой программу загружаемую на CPU1, основной задачей данной программы является настройка перефериии и выделение памяти.
|
||||||
|
* Модуль управления `epwm_test_biss_c_cpu2` и предоставляет собой программу загружаемую на CPU2, основной задачей данной программы является управление резольвером посредсвом генерациии шим сигнала посредством EPWM, снятие показаний с модуля SDFM, передача данных в CLA .
|
||||||
|
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- CCS не ниже версии 12.3.
|
||||||
|
- С2000.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
1. Скачивание репозитория:
|
||||||
|
|
||||||
|
git clone http://sofdev:3000/sedov/MotorControlSdfmCla
|
||||||
|
|
||||||
|
|
||||||
|
2. Импорт проекта в CCS:
|
||||||
|
Запустите CCS.
|
||||||
|
Выберите "Import" -> "Existing CCS Projects into Workspace".
|
||||||
|
Выберите папку, в которую вы скачали проект.
|
||||||
|
Нажмите "Finish".
|
||||||
|
|
||||||
|
3. Сборка проекта:
|
||||||
|
В CCS выберите "Project" -> "Build Project".
|
||||||
@ -24,7 +24,7 @@
|
|||||||
<listOptionValue builtIn="false" value="CCS_MBS_VERSION=6.1.3"/>
|
<listOptionValue builtIn="false" value="CCS_MBS_VERSION=6.1.3"/>
|
||||||
<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
|
<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
|
||||||
<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
|
<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
|
||||||
<listOptionValue builtIn="false" value="PRODUCTS=c2000ware_software_package:5.0.0.00;"/>
|
<listOptionValue builtIn="false" value="PRODUCTS=c2000ware_software_package:5.1.0.00;"/>
|
||||||
<listOptionValue builtIn="false" value="PRODUCT_MACRO_IMPORTS={"c2000ware_software_package":["${COM_TI_C2000WARE_SOFTWARE_PACKAGE_INCLUDE_PATH}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARY_PATH}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARIES}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYMBOLS}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYSCONFIG_MANIFEST}"]}"/>
|
<listOptionValue builtIn="false" value="PRODUCT_MACRO_IMPORTS={"c2000ware_software_package":["${COM_TI_C2000WARE_SOFTWARE_PACKAGE_INCLUDE_PATH}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARY_PATH}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARIES}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYMBOLS}","${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYSCONFIG_MANIFEST}"]}"/>
|
||||||
</option>
|
</option>
|
||||||
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.197899427" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="22.6.0.LTS" valueType="string"/>
|
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.197899427" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="22.6.0.LTS" valueType="string"/>
|
||||||
@ -47,7 +47,7 @@
|
|||||||
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DISPLAY_ERROR_NUMBER.1020551485" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DISPLAY_ERROR_NUMBER.1020551485" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP.1678665744" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP.1678665744" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.INCLUDE_PATH.71573062" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.INCLUDE_PATH" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.INCLUDE_PATH.71573062" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.INCLUDE_PATH" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="${COM_TI_C2000WARE_SOFTWARE_PACKAGE_INSTALL_DIR}"/>
|
<listOptionValue builtIn="false" value="${COM_TI_C2000WARE_SOFTWARE_PACKAGE_INCLUDE_PATH}"/>
|
||||||
<listOptionValue builtIn="false" value="${workspace_loc:/${ProjName}/lib}"/>
|
<listOptionValue builtIn="false" value="${workspace_loc:/${ProjName}/lib}"/>
|
||||||
<listOptionValue builtIn="false" value="${workspace_loc:/${ProjName}/src/CLB}"/>
|
<listOptionValue builtIn="false" value="${workspace_loc:/${ProjName}/src/CLB}"/>
|
||||||
<listOptionValue builtIn="false" value="${workspace_loc:/${ProjName}/src/Peripherals}"/>
|
<listOptionValue builtIn="false" value="${workspace_loc:/${ProjName}/src/Peripherals}"/>
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -1,6 +1,3 @@
|
|||||||
CLA_SCRATCHPAD_SIZE = 0x100;
|
|
||||||
--undef_sym=__cla_scratchpad_end
|
|
||||||
--undef_sym=__cla_scratchpad_start
|
|
||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
@ -64,11 +61,6 @@ MEMORY
|
|||||||
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
|
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
|
||||||
|
|
||||||
RESET : origin = 0x3FFFC0, length = 0x000002
|
RESET : origin = 0x3FFFC0, length = 0x000002
|
||||||
|
|
||||||
CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080
|
|
||||||
CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080
|
|
||||||
CLA1_DMA_MSGRAM : origin = 0x001680, length = 0x000080
|
|
||||||
DMA_CLA1_MSGRAM : origin = 0x001700, length = 0x000080
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
@ -114,63 +106,6 @@ SECTIONS
|
|||||||
Filter4_RegsFile : > RAMGS4, fill=0x4444
|
Filter4_RegsFile : > RAMGS4, fill=0x4444
|
||||||
Difference_RegsFile : >RAMGS5, fill=0x3333
|
Difference_RegsFile : >RAMGS5, fill=0x3333
|
||||||
|
|
||||||
|
|
||||||
/* CLA specific sections */
|
|
||||||
#if defined(__TI_EABI__)
|
|
||||||
Cla1Prog : LOAD = FLASH6,
|
|
||||||
RUN = RAMLS5,
|
|
||||||
LOAD_START(Cla1funcsLoadStart),
|
|
||||||
LOAD_END(Cla1funcsLoadEnd),
|
|
||||||
RUN_START(Cla1funcsRunStart),
|
|
||||||
LOAD_SIZE(Cla1funcsLoadSize),
|
|
||||||
ALIGN(8)
|
|
||||||
#else
|
|
||||||
Cla1Prog : LOAD = FLASH6,
|
|
||||||
RUN = RAMLS5,
|
|
||||||
LOAD_START(_Cla1funcsLoadStart),
|
|
||||||
LOAD_END(_Cla1funcsLoadEnd),
|
|
||||||
RUN_START(_Cla1funcsRunStart),
|
|
||||||
LOAD_SIZE(_Cla1funcsLoadSize),
|
|
||||||
ALIGN(8)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CLADataLS0 : > RAMLS0
|
|
||||||
CLADataLS1 : > RAMLS1
|
|
||||||
|
|
||||||
Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, type=NOINIT
|
|
||||||
CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, type=NOINIT
|
|
||||||
Cla1ToDmaMsgRAM : > CLA1_DMA_MSGRAM, type=NOINIT
|
|
||||||
DmaToCla1MsgRAM : > DMA_CLA1_MSGRAM, type=NOINIT
|
|
||||||
|
|
||||||
Cla1DataRam : >> RAMLS0 | RAMLS1
|
|
||||||
|
|
||||||
/* CLA C compiler sections */
|
|
||||||
//
|
|
||||||
// Must be allocated to memory the CLA has write access to
|
|
||||||
//
|
|
||||||
CLAscratch :
|
|
||||||
{ *.obj(CLAscratch)
|
|
||||||
. += CLA_SCRATCHPAD_SIZE;
|
|
||||||
*.obj(CLAscratch_end) } > RAMLS1
|
|
||||||
|
|
||||||
.scratchpad : > RAMLS1
|
|
||||||
.bss_cla : > RAMLS1
|
|
||||||
cla_shared : > RAMLS1
|
|
||||||
#if defined(__TI_EABI__)
|
|
||||||
.const_cla : LOAD = FLASH2,
|
|
||||||
RUN = RAMLS1,
|
|
||||||
RUN_START(Cla1ConstRunStart),
|
|
||||||
LOAD_START(Cla1ConstLoadStart),
|
|
||||||
LOAD_SIZE(Cla1ConstLoadSize)
|
|
||||||
#else
|
|
||||||
.const_cla : LOAD = FLASH2,
|
|
||||||
RUN = RAMLS1,
|
|
||||||
RUN_START(_Cla1ConstRunStart),
|
|
||||||
LOAD_START(_Cla1ConstLoadStart),
|
|
||||||
LOAD_SIZE(_Cla1ConstLoadSize)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__TI_EABI__)
|
#if defined(__TI_EABI__)
|
||||||
.TI.ramfunc : {} LOAD = FLASH3,
|
.TI.ramfunc : {} LOAD = FLASH3,
|
||||||
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
|
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
|
||||||
|
|||||||
@ -19,23 +19,10 @@
|
|||||||
#include "frmmstr_run.h"
|
#include "frmmstr_run.h"
|
||||||
#include "adc_init.h"
|
#include "adc_init.h"
|
||||||
#include "biss.h"
|
#include "biss.h"
|
||||||
#include "CLAinit.h"
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
InitPerif();
|
InitPerif();
|
||||||
// Определение глобальной константы
|
|
||||||
#pragma DATA_SECTION(glob_buff, "CLADataLS0") // Поместим константу в память, доступную CLA
|
|
||||||
Uint16 glob_buff = 0x555;
|
|
||||||
// Инициализация CLA
|
|
||||||
CLA_configClaMemory();
|
|
||||||
CLA_initCpu1Cla1();
|
|
||||||
Cla1ForceTask1(); // Выполнить задачу 1 один раз для инициализации
|
|
||||||
CLA_runTest();
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -43,7 +30,6 @@ void main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// End of file
|
// End of file
|
||||||
//
|
//
|
||||||
|
|||||||
@ -73,6 +73,8 @@ void GpioSetOrange(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void GpioInit(void)
|
void GpioInit(void)
|
||||||
{
|
{
|
||||||
EALLOW;
|
EALLOW;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* pwm_init.h
|
* pwm_init.h
|
||||||
*
|
*
|
||||||
* Created on: 21 ŕâă. 2023 ă.
|
* Created on: 21 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||||
* Author: seklyuts
|
* Author: seklyuts
|
||||||
*/
|
*/
|
||||||
#include "f28x_project.h"
|
#include "f28x_project.h"
|
||||||
@ -14,28 +14,51 @@
|
|||||||
|
|
||||||
#define FREQUENCY_BRAKE 200000.0 //Hz
|
#define FREQUENCY_BRAKE 200000.0 //Hz
|
||||||
#define FREQUENCY_MOTOR 10000.0 //Hz
|
#define FREQUENCY_MOTOR 10000.0 //Hz
|
||||||
#define EPWM_DB_mkS 3.0 //mkS
|
#define EPWM_DB_mkS 4.0 //mkS
|
||||||
|
#define FREQUENCY_FAN 1000.0 //Hz
|
||||||
|
|
||||||
|
|
||||||
|
#define PERIOD_FAN (SYS_PWM_FREQUENCY/2.0/FREQUENCY_FAN)
|
||||||
|
|
||||||
#define PERIOD_BRAKE (SYS_PWM_FREQUENCY/2.0/FREQUENCY_BRAKE) //Tic
|
#define PERIOD_BRAKE (SYS_PWM_FREQUENCY/2.0/FREQUENCY_BRAKE) //Tic
|
||||||
#define PERIOD_MOTOR (SYS_PWM_FREQUENCY/2.0/FREQUENCY_MOTOR) //Tic
|
#define PERIOD_MOTOR (SYS_PWM_FREQUENCY/2.0/FREQUENCY_MOTOR) //Tic = 5000
|
||||||
|
|
||||||
#define EPWM_DB (EPWM_DB_mkS*SYS_PWM_FREQUENCY/1000000)
|
#define EPWM_DB (EPWM_DB_mkS*SYS_PWM_FREQUENCY/1000000)
|
||||||
|
|
||||||
#define SDFM_DELAY_mkS 50.0 //mkS
|
#define SDFM_DELAY_mkS 50.0 //mkS
|
||||||
#define SDFM_DELAY (SDFM_DELAY_mkS*SYS_PWM_FREQUENCY/1000000)
|
#define SDFM_DELAY (SDFM_DELAY_mkS*SYS_PWM_FREQUENCY/1000000)
|
||||||
|
|
||||||
#define PERIOD_2 (PERIOD_MOTOR/2.0)
|
#define PERIOD_DIV2 (PERIOD_MOTOR/2.0)
|
||||||
#define PWM_MAX (PERIOD_MOTOR - EPWM_DB)
|
#define PERIOD_MAX (PERIOD_MOTOR*1.25)
|
||||||
#define PWM_MIN EPWM_DB*2
|
//#define PWM_MAX (PERIOD_MOTOR - EPWM_DB)
|
||||||
|
//#define PWM_MIN EPWM_DB*2
|
||||||
#define INDEPENDED 1
|
#define INDEPENDED 1
|
||||||
#define COMPLIMENTARY 0
|
#define COMPLIMENTARY 0
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef REF0
|
||||||
|
|
||||||
#define PWM_A 5
|
#define PWM_A 5
|
||||||
#define PWM_B 2
|
#define PWM_B 2
|
||||||
#define PWM_C 7
|
#define PWM_C 7
|
||||||
|
#define PWM_FAN 3
|
||||||
#define PWM_BRAKE 8
|
#define PWM_BRAKE 8
|
||||||
|
|
||||||
|
#define PWM_BASE_TIMER 1
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define PWM_A 5
|
||||||
|
#define PWM_B 4
|
||||||
|
#define PWM_C 2
|
||||||
|
#define PWM_FAN 3
|
||||||
|
#define PWM_BRAKE 8
|
||||||
|
|
||||||
|
#define PWM_BASE_TIMER 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void PWMInit(uint16_t Num, uint16_t Period, uint16_t Independed);
|
void PWMInit(uint16_t Num, uint16_t Period, uint16_t Independed);
|
||||||
void PWMGpioInit(void);
|
void PWMGpioInit(void);
|
||||||
void PWMInitEnable(void);
|
void PWMInitEnable(void);
|
||||||
@ -43,7 +66,7 @@ void PWMInitInterruptEn(void);
|
|||||||
void PWMAllInit(void);
|
void PWMAllInit(void);
|
||||||
void PWM_ABC_StopAllClose(void);
|
void PWM_ABC_StopAllClose(void);
|
||||||
void PWM_ABC_StartOut(void);
|
void PWM_ABC_StartOut(void);
|
||||||
|
void PWM_ABC_Start(uint16_t Num);
|
||||||
|
|
||||||
void InitEPwm1Example(void);
|
void InitEPwm1Example(void);
|
||||||
void InitEPwm2Example(void);
|
void InitEPwm2Example(void);
|
||||||
|
|||||||
@ -35,7 +35,7 @@ typedef struct
|
|||||||
int16_t UC;
|
int16_t UC;
|
||||||
}strPWMABC;
|
}strPWMABC;
|
||||||
|
|
||||||
volatile strPWMABC PWM_motor = {PERIOD_2, PERIOD_2, PERIOD_2};
|
volatile strPWMABC PWM_motor = {PERIOD_DIV2, PERIOD_DIV2, PERIOD_DIV2};
|
||||||
|
|
||||||
int16_t A_proc,B_proc,C_proc;
|
int16_t A_proc,B_proc,C_proc;
|
||||||
uint16_t PWM_Vent = PERIOD_MOTOR;
|
uint16_t PWM_Vent = PERIOD_MOTOR;
|
||||||
@ -44,9 +44,9 @@ uint16_t PWM_Chop = 0;
|
|||||||
void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC, float Udc)
|
void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC, float Udc)
|
||||||
{
|
{
|
||||||
|
|
||||||
A_proc = (int16_t)((phaseA/Udc)*PERIOD_2);
|
A_proc = (int16_t)((phaseA/Udc)*PERIOD_DIV2);
|
||||||
B_proc = (int16_t)((phaseB/Udc)*PERIOD_2);
|
B_proc = (int16_t)((phaseB/Udc)*PERIOD_DIV2);
|
||||||
C_proc = (int16_t)((phaseC/Udc)*PERIOD_2);
|
C_proc = (int16_t)((phaseC/Udc)*PERIOD_DIV2);
|
||||||
|
|
||||||
if(A_proc > 0) A_proc+= EPWM_DB/2;
|
if(A_proc > 0) A_proc+= EPWM_DB/2;
|
||||||
else if(A_proc < 0) A_proc-= EPWM_DB/2;
|
else if(A_proc < 0) A_proc-= EPWM_DB/2;
|
||||||
@ -55,9 +55,9 @@ void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC, float Udc)
|
|||||||
if(C_proc > 0) C_proc+= EPWM_DB/2;
|
if(C_proc > 0) C_proc+= EPWM_DB/2;
|
||||||
else if(C_proc < 0) C_proc-= EPWM_DB/2;
|
else if(C_proc < 0) C_proc-= EPWM_DB/2;
|
||||||
|
|
||||||
PWM_motor.UA = PERIOD_2 + A_proc;
|
PWM_motor.UA = PERIOD_DIV2 + A_proc;
|
||||||
PWM_motor.UB = PERIOD_2 + B_proc;
|
PWM_motor.UB = PERIOD_DIV2 + B_proc;
|
||||||
PWM_motor.UC = PERIOD_2 - C_proc;
|
PWM_motor.UC = PERIOD_DIV2 - C_proc;
|
||||||
|
|
||||||
FaultABC = 0;//(FaultPWM);
|
FaultABC = 0;//(FaultPWM);
|
||||||
if(FaultABC) FaultABCFix = FaultABC;
|
if(FaultABC) FaultABCFix = FaultABC;
|
||||||
@ -65,9 +65,9 @@ void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC, float Udc)
|
|||||||
if((FaultABC)||(FaultABCFix))
|
if((FaultABC)||(FaultABCFix))
|
||||||
{
|
{
|
||||||
PWM_ABC_StopAllClose();
|
PWM_ABC_StopAllClose();
|
||||||
PWM_motor.UA = PERIOD_2;
|
PWM_motor.UA = PERIOD_DIV2;
|
||||||
PWM_motor.UB = PERIOD_2;
|
PWM_motor.UB = PERIOD_DIV2;
|
||||||
PWM_motor.UC = PERIOD_2;
|
PWM_motor.UC = PERIOD_DIV2;
|
||||||
vectorFault();
|
vectorFault();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,9 +132,9 @@ __interrupt void epwm2_isr(void)
|
|||||||
AdcStartSet();
|
AdcStartSet();
|
||||||
BissStartSet();
|
BissStartSet();
|
||||||
PWM_ABC_StopAllClose();
|
PWM_ABC_StopAllClose();
|
||||||
PWM_motor.UA = PERIOD_2;
|
PWM_motor.UA = PERIOD_DIV2;
|
||||||
PWM_motor.UB = PERIOD_2;
|
PWM_motor.UB = PERIOD_DIV2;
|
||||||
PWM_motor.UC = PERIOD_2;
|
PWM_motor.UC = PERIOD_DIV2;
|
||||||
vectorFault();
|
vectorFault();
|
||||||
EPwmRegs[3]->CMPA.bit.CMPA = PERIOD_MOTOR - PWM_Vent;
|
EPwmRegs[3]->CMPA.bit.CMPA = PERIOD_MOTOR - PWM_Vent;
|
||||||
EPwmRegs[3]->CMPB.bit.CMPB = PERIOD_MOTOR - PWM_Chop;
|
EPwmRegs[3]->CMPB.bit.CMPB = PERIOD_MOTOR - PWM_Chop;
|
||||||
|
|||||||
@ -137,9 +137,6 @@ void SdfmGpioInit(void)
|
|||||||
GPIO_SetupPinOptions(25, GPIO_INPUT, GPIO_ASYNC);
|
GPIO_SetupPinOptions(25, GPIO_INPUT, GPIO_ASYNC);
|
||||||
GPIO_SetupPinMux(25,GPIO_MUX_CPU2,7); //SDFM-2 Channel 1 Clock Input
|
GPIO_SetupPinMux(25,GPIO_MUX_CPU2,7); //SDFM-2 Channel 1 Clock Input
|
||||||
|
|
||||||
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0x03;
|
|
||||||
GpioCtrlRegs.GPAGMUX2.bit.GPIO25 = 0x01;
|
|
||||||
|
|
||||||
GPIO_SetupPinOptions(58, GPIO_INPUT, GPIO_ASYNC);
|
GPIO_SetupPinOptions(58, GPIO_INPUT, GPIO_ASYNC);
|
||||||
GPIO_SetupPinMux(58,GPIO_MUX_CPU2,7); //SDFM-2 Channel 2 Data Input (Udc)
|
GPIO_SetupPinMux(58,GPIO_MUX_CPU2,7); //SDFM-2 Channel 2 Data Input (Udc)
|
||||||
GPIO_SetupPinOptions(59, GPIO_INPUT, GPIO_ASYNC);
|
GPIO_SetupPinOptions(59, GPIO_INPUT, GPIO_ASYNC);
|
||||||
|
|||||||
33
epwm_test_biss_c_cpu1/src/Peripherals/sdfm_pwm_xbar.c
Normal file
33
epwm_test_biss_c_cpu1/src/Peripherals/sdfm_pwm_xbar.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* sdfm_pwm_xbar.c
|
||||||
|
*
|
||||||
|
* Created on: 29 авг. 2024 г.
|
||||||
|
* Author: seklyuts
|
||||||
|
*/
|
||||||
|
#include "f28x_project.h"
|
||||||
|
#include "pwm_init.h"
|
||||||
|
|
||||||
|
|
||||||
|
void sdfm_pwm_xbarInit(void)
|
||||||
|
{
|
||||||
|
EALLOW;
|
||||||
|
// EPwmXbarRegs.TRIPLOCK = 0x5A5A0000;
|
||||||
|
// EPwmXbarRegs.TRIP4MUX0TO15CFG.bit. = ; //str 2145
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX16 = 1;//SD1FLT1.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX18 = 1;//SD1FLT2.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX20 = 1;//SD1FLT3.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX22 = 1;//SD1FLT4.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX24 = 1;//SD2FLT1.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX26 = 1;//SD2FLT2.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX28 = 1;//SD2FLT3.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX30 = 1;//SD2FLT4.CEVT1_OR_CEVT2
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX16 = 1;
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX18 = 1;
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX20 = 1;
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX22 = 1;
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX24 = 1;
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX26 = 1;
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX28 = 1;
|
||||||
|
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX30 = 1;
|
||||||
|
EDIS;
|
||||||
|
}
|
||||||
13
epwm_test_biss_c_cpu1/src/Peripherals/sdfm_pwm_xbar.h
Normal file
13
epwm_test_biss_c_cpu1/src/Peripherals/sdfm_pwm_xbar.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* sdfm_pwm_xbar.h
|
||||||
|
*
|
||||||
|
* Created on: 29 авг. 2024 г.
|
||||||
|
* Author: seklyuts
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SRC_PERIPHERALS_SDFM_PWM_XBAR_H_
|
||||||
|
#define SRC_PERIPHERALS_SDFM_PWM_XBAR_H_
|
||||||
|
|
||||||
|
void sdfm_pwm_xbarInit(void);
|
||||||
|
|
||||||
|
#endif /* SRC_PERIPHERALS_SDFM_PWM_XBAR_H_ */
|
||||||
@ -17,6 +17,7 @@
|
|||||||
#include "i2c_init.h"
|
#include "i2c_init.h"
|
||||||
#include "spi_init.h"
|
#include "spi_init.h"
|
||||||
#include "biss.h"
|
#include "biss.h"
|
||||||
|
#include "sdfm_pwm_xbar.h"
|
||||||
|
|
||||||
|
|
||||||
#define TO_CPU1 0
|
#define TO_CPU1 0
|
||||||
@ -117,6 +118,7 @@ void InitPerif(void)
|
|||||||
BissGpioInit();
|
BissGpioInit();
|
||||||
BissInit();
|
BissInit();
|
||||||
|
|
||||||
|
sdfm_pwm_xbarInit();
|
||||||
|
|
||||||
|
|
||||||
// ConfigureADC();
|
// ConfigureADC();
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<configurations XML_version="1.2" id="configurations_0">
|
<configurations XML_version="1.2" id="configurations_0">
|
||||||
|
|
||||||
|
|
||||||
<configuration XML_version="1.2" id="Texas Instruments XDS2xx USB Debug Probe_0">
|
<configuration XML_version="1.2" id="Texas Instruments XDS2xx USB Debug Probe_0">
|
||||||
<instance XML_version="1.2" desc="Texas Instruments XDS2xx USB Debug Probe_0" href="connections/TIXDS2XXUSB_Connection.xml" id="Texas Instruments XDS2xx USB Debug Probe_0" xml="TIXDS2XXUSB_Connection.xml" xmlpath="connections"/>
|
<instance XML_version="1.2" desc="Texas Instruments XDS2xx USB Debug Probe_0" href="connections/TIXDS2XXUSB_Connection.xml" id="Texas Instruments XDS2xx USB Debug Probe_0" xml="TIXDS2XXUSB_Connection.xml" xmlpath="connections"/>
|
||||||
<connection XML_version="1.2" id="Texas Instruments XDS2xx USB Debug Probe_0">
|
<connection XML_version="1.2" id="Texas Instruments XDS2xx USB Debug Probe_0">
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -1,3 +1,6 @@
|
|||||||
|
CLA_SCRATCHPAD_SIZE = 0x100;
|
||||||
|
--undef_sym=__cla_scratchpad_end
|
||||||
|
--undef_sym=__cla_scratchpad_start
|
||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
@ -61,6 +64,11 @@ MEMORY
|
|||||||
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
|
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
|
||||||
|
|
||||||
RESET : origin = 0x3FFFC0, length = 0x000002
|
RESET : origin = 0x3FFFC0, length = 0x000002
|
||||||
|
|
||||||
|
CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080
|
||||||
|
CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080
|
||||||
|
CLA1_DMA_MSGRAM : origin = 0x001680, length = 0x000080
|
||||||
|
DMA_CLA1_MSGRAM : origin = 0x001700, length = 0x000080
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
@ -100,7 +108,7 @@ SECTIONS
|
|||||||
|
|
||||||
/* The following section definition are for SDFM examples */
|
/* The following section definition are for SDFM examples */
|
||||||
// Filter_RegsFile : > RAMGS10
|
// Filter_RegsFile : > RAMGS10
|
||||||
Filter1_RegsFile : > RAMLS1
|
Filter1_RegsFile : > RAMGS5
|
||||||
Filter2_RegsFile : > RAMLS2
|
Filter2_RegsFile : > RAMLS2
|
||||||
Filter3_RegsFile : > RAMLS3
|
Filter3_RegsFile : > RAMLS3
|
||||||
Filter4_RegsFile : > RAMLS4
|
Filter4_RegsFile : > RAMLS4
|
||||||
@ -114,6 +122,66 @@ SECTIONS
|
|||||||
// Filter14_RegsFile : > RAMGS14
|
// Filter14_RegsFile : > RAMGS14
|
||||||
// Difference_RegsFile : >RAMGS5
|
// Difference_RegsFile : >RAMGS5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CLA specific sections */
|
||||||
|
#if defined(__TI_EABI__)
|
||||||
|
Cla1Prog : LOAD = FLASH6,
|
||||||
|
RUN = RAMLS7,
|
||||||
|
LOAD_START(Cla1funcsLoadStart),
|
||||||
|
LOAD_END(Cla1funcsLoadEnd),
|
||||||
|
RUN_START(Cla1funcsRunStart),
|
||||||
|
LOAD_SIZE(Cla1funcsLoadSize),
|
||||||
|
ALIGN(8)
|
||||||
|
#else
|
||||||
|
Cla1Prog : LOAD = FLASH6,
|
||||||
|
RUN = RAMLS7,
|
||||||
|
LOAD_START(_Cla1funcsLoadStart),
|
||||||
|
LOAD_END(_Cla1funcsLoadEnd),
|
||||||
|
RUN_START(_Cla1funcsRunStart),
|
||||||
|
LOAD_SIZE(_Cla1funcsLoadSize),
|
||||||
|
ALIGN(8)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CLADataLS0 : > RAMLS0
|
||||||
|
CLADataLS1 : > RAMLS1
|
||||||
|
|
||||||
|
Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, type=NOINIT
|
||||||
|
CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, type=NOINIT
|
||||||
|
Cla1ToDmaMsgRAM : > CLA1_DMA_MSGRAM, type=NOINIT
|
||||||
|
DmaToCla1MsgRAM : > DMA_CLA1_MSGRAM, type=NOINIT
|
||||||
|
|
||||||
|
Cla1DataRam : >> RAMLS0 | RAMLS1
|
||||||
|
|
||||||
|
/* CLA C compiler sections */
|
||||||
|
//
|
||||||
|
// Must be allocated to memory the CLA has write access to
|
||||||
|
//
|
||||||
|
CLAscratch :
|
||||||
|
{ *.obj(CLAscratch)
|
||||||
|
. += CLA_SCRATCHPAD_SIZE;
|
||||||
|
*.obj(CLAscratch_end) } > RAMLS1
|
||||||
|
|
||||||
|
.scratchpad : > RAMLS1
|
||||||
|
.bss_cla : > RAMLS1
|
||||||
|
cla_shared : > RAMLS1
|
||||||
|
#if defined(__TI_EABI__)
|
||||||
|
.const_cla : LOAD = FLASH2,
|
||||||
|
RUN = RAMLS1,
|
||||||
|
RUN_START(Cla1ConstRunStart),
|
||||||
|
LOAD_START(Cla1ConstLoadStart),
|
||||||
|
LOAD_SIZE(Cla1ConstLoadSize)
|
||||||
|
#else
|
||||||
|
.const_cla : LOAD = FLASH2,
|
||||||
|
RUN = RAMLS1,
|
||||||
|
RUN_START(_Cla1ConstRunStart),
|
||||||
|
LOAD_START(_Cla1ConstLoadStart),
|
||||||
|
LOAD_SIZE(_Cla1ConstLoadSize)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__TI_EABI__)
|
#if defined(__TI_EABI__)
|
||||||
.TI.ramfunc : {} LOAD = FLASH3,
|
.TI.ramfunc : {} LOAD = FLASH3,
|
||||||
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
|
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
|
||||||
|
|||||||
Binary file not shown.
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
InitPerif();
|
InitPerif();
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
|
|||||||
@ -230,7 +230,7 @@ void Bl25cm1a_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16_t * wri
|
|||||||
while( (Addr_8bit&0xFF)+(quant_8bit) > BL25CM1A0_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
|
while( (Addr_8bit&0xFF)+(quant_8bit) > BL25CM1A0_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
|
||||||
{
|
{
|
||||||
page_quant_8bit = BL25CM1A0_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
page_quant_8bit = BL25CM1A0_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
||||||
Bl25cm1a_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
|
Bl25cm1a_write_1_page(Addr_8bit, page_quant_8bit, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
|
||||||
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
|
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
|
||||||
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå
|
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå
|
||||||
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
|
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* GD25Q16ETIGR.c
|
* GD25Q16ETIGR.c
|
||||||
*
|
*
|
||||||
* Created on: 7 ñåíò. 2023 ã.
|
* Created on: 7 сент. 2023 г.
|
||||||
* Author: seklyuts
|
* Author: seklyuts
|
||||||
*/
|
*/
|
||||||
#include "f28x_project.h"
|
#include "f28x_project.h"
|
||||||
@ -29,15 +29,27 @@ uint16_t GD25Q16ETIGR_buffer8bytes[8];
|
|||||||
|
|
||||||
uint16_t SectorWasErraised[512];
|
uint16_t SectorWasErraised[512];
|
||||||
|
|
||||||
|
uint16_t writeVerify = 1;
|
||||||
|
|
||||||
uint16_t GD25Q16ETIGR_Sektor_Addr(uint32_t Addr)
|
|
||||||
|
void delay(void)
|
||||||
{
|
{
|
||||||
uint16_t sektor;
|
uint32_t i;
|
||||||
for (sektor=1; sektor <= 512; sektor++ )
|
for(i=0;i<100000;i++)
|
||||||
{
|
{
|
||||||
if(Addr < (0x1000*sektor)) return sektor-1;
|
asm (" NOP");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GD25Q16ETIGR_checkRXFFST(void)
|
||||||
|
{
|
||||||
|
volatile uint16_t empty;
|
||||||
|
while(SpiRegs.SPIFFRX.bit.RXFFST > 0)
|
||||||
|
{
|
||||||
|
empty = SpiRegs.SPIRXBUF;
|
||||||
}
|
}
|
||||||
return 511;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -54,6 +66,7 @@ void GD25Q16ETIGR_clean_SectorWasErraised(void)
|
|||||||
void GD25Q16ETIGR_en(void)
|
void GD25Q16ETIGR_en(void)
|
||||||
{
|
{
|
||||||
volatile uint16_t empty;
|
volatile uint16_t empty;
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
transmitData(WriteEnable);
|
transmitData(WriteEnable);
|
||||||
while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
|
while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
|
||||||
{
|
{
|
||||||
@ -65,6 +78,7 @@ void GD25Q16ETIGR_en(void)
|
|||||||
uint16_t GD25Q16ETIGR_ReadStatus(void)
|
uint16_t GD25Q16ETIGR_ReadStatus(void)
|
||||||
{
|
{
|
||||||
volatile uint16_t empty;
|
volatile uint16_t empty;
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
transmitData(ReadStatusRegister1);
|
transmitData(ReadStatusRegister1);
|
||||||
transmitData(0xFF);
|
transmitData(0xFF);
|
||||||
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
|
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
|
||||||
@ -76,18 +90,37 @@ uint16_t GD25Q16ETIGR_ReadStatus(void)
|
|||||||
return empty;
|
return empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GD25Q16ETIGR_sector_erase(uint32_t Addr)
|
volatile uint32_t MaxRepeat = 0;
|
||||||
|
|
||||||
|
uint16_t GD25Q16ETIGR_WaitStatus(void)
|
||||||
{
|
{
|
||||||
volatile uint16_t empty;
|
uint16_t repeat = 0, ErrRepeat = 0x4000;
|
||||||
uint16_t Stat = 1;
|
uint16_t Stat = 1;
|
||||||
|
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
Stat = GD25Q16ETIGR_ReadStatus();
|
||||||
while((Stat&0x1) != 0 )
|
while((Stat&0x1) != 0 )
|
||||||
{
|
{
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
Stat = GD25Q16ETIGR_ReadStatus();
|
||||||
|
repeat++;
|
||||||
|
if(repeat > ErrRepeat) return 1;
|
||||||
}
|
}
|
||||||
|
if(repeat > MaxRepeat) MaxRepeat = repeat;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t GD25Q16ETIGR_sector_erase(uint32_t Addr)
|
||||||
|
{
|
||||||
|
volatile uint16_t empty;
|
||||||
|
|
||||||
|
uint16_t Err = 0;
|
||||||
|
GD25Q16ETIGR_en();
|
||||||
|
Err = GD25Q16ETIGR_WaitStatus();
|
||||||
|
if(Err) return Err;
|
||||||
|
|
||||||
GD25Q16ETIGR_en();
|
GD25Q16ETIGR_en();
|
||||||
|
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
|
|
||||||
transmitData(SectorErase);
|
transmitData(SectorErase);
|
||||||
transmitData(Addr>>16);
|
transmitData(Addr>>16);
|
||||||
transmitData(Addr>>8);
|
transmitData(Addr>>8);
|
||||||
@ -100,18 +133,19 @@ void GD25Q16ETIGR_sector_erase(uint32_t Addr)
|
|||||||
empty = SpiRegs.SPIRXBUF;
|
empty = SpiRegs.SPIRXBUF;
|
||||||
empty = SpiRegs.SPIRXBUF;
|
empty = SpiRegs.SPIRXBUF;
|
||||||
empty = SpiRegs.SPIRXBUF;
|
empty = SpiRegs.SPIRXBUF;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//÷òåíèå äî 8 áàéò
|
uint16_t GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//чтение до 8 байт
|
||||||
{
|
{
|
||||||
volatile uint16_t empty, i, j;
|
volatile uint16_t empty, i, j;
|
||||||
uint16_t Stat = 1;
|
|
||||||
|
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
uint16_t Err = 0;
|
||||||
while((Stat&0x1) != 0 )
|
|
||||||
{
|
Err = GD25Q16ETIGR_WaitStatus();
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
if(Err) return Err;
|
||||||
}
|
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
|
|
||||||
transmitData(ReadData);
|
transmitData(ReadData);
|
||||||
transmitData(Addr>>16);
|
transmitData(Addr>>16);
|
||||||
@ -130,18 +164,19 @@ void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num
|
|||||||
{
|
{
|
||||||
read_data[j] = SpiRegs.SPIRXBUF;
|
read_data[j] = SpiRegs.SPIRXBUF;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)//÷òåíèå è ïðîâåðêà äî 8 áàéò
|
uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)//чтение и проверка до 8 байт
|
||||||
{
|
{
|
||||||
volatile uint16_t empty, i, j;
|
volatile uint16_t empty, i, j;
|
||||||
uint16_t Stat = 1;
|
|
||||||
|
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
uint16_t Err = 0;
|
||||||
while((Stat&0x1) != 0 )
|
|
||||||
{
|
Err = GD25Q16ETIGR_WaitStatus();
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
if(Err) return Err;
|
||||||
}
|
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
|
|
||||||
transmitData(ReadData);
|
transmitData(ReadData);
|
||||||
transmitData(Addr>>16);
|
transmitData(Addr>>16);
|
||||||
@ -158,23 +193,33 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint
|
|||||||
empty = SpiRegs.SPIRXBUF;
|
empty = SpiRegs.SPIRXBUF;
|
||||||
for(j = 0; j<num_byte; j++)
|
for(j = 0; j<num_byte; j++)
|
||||||
{
|
{
|
||||||
if(verify_data[j] != SpiRegs.SPIRXBUF) return 1;
|
if(verify_data[j] != SpiRegs.SPIRXBUF) Err++;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
|
|
||||||
|
return Err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//çàïèñü äî 8 áàéò
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//запись до 8 байт
|
||||||
{
|
{
|
||||||
volatile uint16_t empty, i, j;
|
volatile uint16_t empty, i, j;
|
||||||
uint16_t Stat = 1;
|
|
||||||
|
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
uint16_t Err = 0;
|
||||||
while((Stat&0x1) != 0 )
|
GD25Q16ETIGR_en();
|
||||||
{
|
Err = GD25Q16ETIGR_WaitStatus();
|
||||||
Stat = GD25Q16ETIGR_ReadStatus();
|
if(Err) return Err;
|
||||||
}
|
|
||||||
|
|
||||||
GD25Q16ETIGR_en();
|
GD25Q16ETIGR_en();
|
||||||
|
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
|
|
||||||
transmitData(PageProgram);
|
transmitData(PageProgram);
|
||||||
transmitData(Addr>>16);
|
transmitData(Addr>>16);
|
||||||
transmitData(Addr>>8);
|
transmitData(Addr>>8);
|
||||||
@ -192,28 +237,83 @@ void GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t n
|
|||||||
{
|
{
|
||||||
empty = SpiRegs.SPIRXBUF;
|
empty = SpiRegs.SPIRXBUF;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
|
|
||||||
|
uint32_t ErrAdr[8];// адреса неисправных байтов, которые не удалось записать даже повторно.
|
||||||
|
uint32_t CounterOfFixedError = 0;
|
||||||
|
uint32_t CounterOfTotalError = 0;
|
||||||
|
|
||||||
|
uint16_t GD25Q16ETIGR_write_veryfy_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//запись и проверка до 8 байт
|
||||||
|
{
|
||||||
|
uint16_t addr_write_data[8];
|
||||||
|
uint16_t addr_read_data[8];
|
||||||
|
uint16_t i, Err = 0, DoneOK = 0;
|
||||||
|
|
||||||
|
for(i = 0; i<num_byte; i++)
|
||||||
|
{
|
||||||
|
addr_write_data[i] = write_data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
Err = GD25Q16ETIGR_write_8_bytes(Addr, addr_write_data, num_byte);
|
||||||
|
if(Err) return Err;
|
||||||
|
Err = GD25Q16ETIGR_read_8_bytes(Addr, addr_read_data, num_byte);
|
||||||
|
if(Err) return Err;
|
||||||
|
|
||||||
|
for(i = 0; i<num_byte; i++)
|
||||||
|
{
|
||||||
|
if(addr_write_data[i] == addr_read_data[i])
|
||||||
|
{
|
||||||
|
DoneOK++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data+i, 1);
|
||||||
|
if(Err) return Err;
|
||||||
|
Err = GD25Q16ETIGR_read_8_bytes(Addr, addr_read_data, num_byte);
|
||||||
|
if(Err) return Err;
|
||||||
|
if(addr_write_data[i] == addr_read_data[i])
|
||||||
|
{
|
||||||
|
DoneOK++;
|
||||||
|
CounterOfFixedError++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ErrAdr[Err] = Addr+i;
|
||||||
|
CounterOfTotalError++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
|
||||||
{
|
{
|
||||||
uint32_t i=0;
|
uint32_t i=0;
|
||||||
uint16_t addr_read_data[8];
|
uint16_t addr_read_data[8];
|
||||||
|
uint16_t Err = 0;
|
||||||
|
|
||||||
if(quant8 > 8)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
{//в этом цикле только полные посылки по 8 байт
|
||||||
GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
|
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
|
||||||
|
if(Err) return Err;
|
||||||
copy8_to_16(addr_read_data, read_data, 4);
|
copy8_to_16(addr_read_data, read_data, 4);
|
||||||
read_data+=4;
|
read_data+=4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i < quant8)
|
if(i < quant8)
|
||||||
{//òóò ì.á. îò 1 äî 8 áàéò
|
{//тут м.б. от 1 до 8 байт
|
||||||
GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
|
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
|
||||||
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//åñëè áàéò íå÷¸òíîå ÷èñëî, òî äîïîëíÿåì äî ÷¸òíîãî íóë¸ì
|
if(Err) return Err;
|
||||||
|
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//если байт нечётное число, то дополняем до чётного нулём
|
||||||
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
|
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -226,14 +326,14 @@ uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * ver
|
|||||||
if(quant8 > 8)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
{//в этом цикле только полные посылки по 8 байт
|
||||||
copy16_to_8(verify_data, addr_vfy_data, 4);
|
copy16_to_8(verify_data, addr_vfy_data, 4);
|
||||||
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
|
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
|
||||||
verify_data+=4;
|
verify_data+=4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i < quant8)
|
if(i < quant8)
|
||||||
{//òóò ì.á. îò 1 äî 8 áàéò
|
{//тут м.б. от 1 до 8 байт
|
||||||
quant16 = quant16bitWords(quant8-i);
|
quant16 = quant16bitWords(quant8-i);
|
||||||
copy16_to_8(verify_data, addr_vfy_data, quant16);
|
copy16_to_8(verify_data, addr_vfy_data, quant16);
|
||||||
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, (quant8 - i))) return 1;
|
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, (quant8 - i))) return 1;
|
||||||
@ -241,57 +341,67 @@ uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * ver
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * write_data) // çàïèñü âíóòðè îäíîé ñòðàíèöû
|
uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * write_data) // запись внутри одной страницы
|
||||||
{
|
{
|
||||||
uint32_t i=0;
|
uint32_t i=0;
|
||||||
uint16_t addr_write_data[8];
|
uint16_t addr_write_data[8];
|
||||||
uint16_t quant16;
|
uint16_t quant16;
|
||||||
|
uint16_t Err = 0;
|
||||||
|
|
||||||
if(quant8 > 8)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
{ //в этом цикле только полные посылки по 8 байт
|
||||||
copy16_to_8(write_data, addr_write_data, 4);
|
copy16_to_8(write_data, addr_write_data, 4);
|
||||||
GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
|
if(!writeVerify) Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
|
||||||
|
else Err = GD25Q16ETIGR_write_veryfy_8_bytes(Addr+i, addr_write_data, 8);
|
||||||
|
if(Err) return Err;
|
||||||
write_data += 4;
|
write_data += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i < quant8)
|
if(i < quant8)
|
||||||
{//òóò ì.á. îò 1 äî 8 áàéò
|
{//тут м.б. от 1 до 8 байт
|
||||||
quant16 = quant16bitWords(quant8-i);
|
quant16 = quant16bitWords(quant8-i);
|
||||||
copy16_to_8(write_data, addr_write_data, quant16);
|
copy16_to_8(write_data, addr_write_data, quant16);
|
||||||
GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
|
if(!writeVerify) Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
|
||||||
|
else Err = GD25Q16ETIGR_write_veryfy_8_bytes(Addr+i, addr_write_data, (quant8 - i));
|
||||||
|
if(Err) return Err;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16_t * write_data)
|
uint16_t GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16_t * write_data)
|
||||||
{
|
{
|
||||||
uint16_t * addr_write_data = write_data;
|
uint16_t * addr_write_data = write_data;
|
||||||
uint16_t page_quant_8bit = 0;
|
uint16_t page_quant_8bit = 0;
|
||||||
uint16_t FlashSektorStart = 0;
|
uint16_t FlashSektorStart = 0;
|
||||||
uint16_t FlashSektorEnd = 0;
|
uint16_t FlashSektorEnd = 0;
|
||||||
uint16_t i=0;
|
uint16_t i=0;
|
||||||
|
uint16_t Err = 0;
|
||||||
|
|
||||||
FlashSektorStart = GD25Q16ETIGR_Sektor_Addr(Addr_8bit); //ñåêòîð ñ êîòîðîãî íà÷èíàåòñÿ çàïèñü
|
FlashSektorStart = (Addr_8bit)>>12; //сектор с которого начинается запись
|
||||||
FlashSektorEnd = GD25Q16ETIGR_Sektor_Addr(Addr_8bit + quant_8bit - 1); //ñåêòîð â êîòîðîì êîíåö çàïèñè
|
FlashSektorEnd = (Addr_8bit + quant_8bit - 1)>>12; //сектор в котором конец записи
|
||||||
|
|
||||||
for(i = FlashSektorStart; i <= FlashSektorEnd; i++)
|
for(i = FlashSektorStart; i <= FlashSektorEnd; i++)
|
||||||
{
|
{
|
||||||
if(!SectorWasErraised[i]) {SectorWasErraised[i] = 1; GD25Q16ETIGR_sector_erase(i*0x1000);}
|
if(!SectorWasErraised[i]) {SectorWasErraised[i] = 1; Err = GD25Q16ETIGR_sector_erase((uint32_t)i*0x1000); if(Err) return Err;}
|
||||||
}
|
}
|
||||||
|
|
||||||
while( (Addr_8bit&0xFF)+(quant_8bit) > GD25Q16E_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
|
while( (Addr_8bit&0xFF)+(quant_8bit) > GD25Q16E_PAGE) //если данные выходят за границу текущей страницы
|
||||||
{
|
{
|
||||||
page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //вычисляем кол-во байт данных до конца текущей страницы
|
||||||
GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
|
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit, addr_write_data); //записываем эти данные на текущую страницу
|
||||||
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
|
if(Err) return Err;
|
||||||
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå (îíè ó íàñ 16-áèòíûìè ñëîâàìè)
|
Addr_8bit += page_quant_8bit; //перелистываем страницу внешней памяти
|
||||||
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
|
addr_write_data += page_quant_8bit/2; //шагаем на следующие незаписанные данные в буфере (они у нас 16-битными словами)
|
||||||
|
quant_8bit -= page_quant_8bit; //уменьшаем кол-во данных на величину которую уже записали
|
||||||
}
|
}
|
||||||
if(quant_8bit > 0)
|
if(quant_8bit > 0)
|
||||||
{
|
{
|
||||||
GD25Q16ETIGR_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
|
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //если данные для записи остались, то записываем их
|
||||||
|
if(Err) return Err;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -300,6 +410,9 @@ void GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16_t *
|
|||||||
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void)
|
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void)
|
||||||
{
|
{
|
||||||
volatile uint16_t empty, i, j;
|
volatile uint16_t empty, i, j;
|
||||||
|
|
||||||
|
// GD25Q16ETIGR_checkRXFFST();
|
||||||
|
|
||||||
transmitData(ReadManufacturerDeviceID);
|
transmitData(ReadManufacturerDeviceID);
|
||||||
|
|
||||||
for(i = 0; i<5; i++) transmitData(0xFF);
|
for(i = 0; i<5; i++) transmitData(0xFF);
|
||||||
|
|||||||
@ -13,8 +13,8 @@
|
|||||||
|
|
||||||
void GD25Q16ETIGR_en(void);
|
void GD25Q16ETIGR_en(void);
|
||||||
void GD25Q16ETIGR_write(void);
|
void GD25Q16ETIGR_write(void);
|
||||||
void GD25Q16ETIGR_write_data(uint32_t Addr, uint16_t quant, uint16_t * write_data);
|
uint16_t GD25Q16ETIGR_write_data(uint32_t Addr, uint16_t quant, uint16_t * write_data);
|
||||||
void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, uint16_t * read_data);
|
uint16_t GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, uint16_t * read_data);
|
||||||
uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_data);
|
uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_data);
|
||||||
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void);
|
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void);
|
||||||
void GD25Q16ETIGR_clean_SectorWasErraised(void);
|
void GD25Q16ETIGR_clean_SectorWasErraised(void);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* ZD24C02A.c
|
* ZD24C02A.c
|
||||||
*
|
*
|
||||||
* Created on: 8 сент. 2023 г.
|
* Created on: 8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||||
* Author: seklyuts
|
* Author: seklyuts
|
||||||
*/
|
*/
|
||||||
#include "f28x_project.h"
|
#include "f28x_project.h"
|
||||||
@ -9,12 +9,12 @@
|
|||||||
#include "ZD24C02A.h"
|
#include "ZD24C02A.h"
|
||||||
#include "Arr.h"
|
#include "Arr.h"
|
||||||
|
|
||||||
//Нуждается в проверке и отладке, так как с этой микросхемой не удалось добиться стабильной работы, она то работает, то нет
|
|
||||||
|
|
||||||
volatile uint16_t SlaveAdr = I2C_SLAVE_ADDRESS;
|
|
||||||
|
volatile uint16_t SlaveAdr = I2C_SLAVE_ADDRESS1;
|
||||||
uint16_t BufferZD24C02A[17];
|
uint16_t BufferZD24C02A[17];
|
||||||
|
|
||||||
uint16_t ZD24C02A_write_8(uint16_t Addr, uint16_t * Array, uint16_t quant)// может писать очередями по 16 байт
|
uint16_t ZD24C02A_write_8(uint16_t Addr, uint16_t * Array, uint16_t quant)// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 16 <20><><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
if(I2CWrite(SlaveAdr, Addr, quant, true, Array)) return 1;
|
if(I2CWrite(SlaveAdr, Addr, quant, true, Array)) return 1;
|
||||||
else return 0;
|
else return 0;
|
||||||
@ -41,24 +41,33 @@ uint16_t ZD24C02A_verify_8(uint16_t Addr, uint16_t * Array, uint16_t quant)
|
|||||||
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t quant8, uint16_t * write_data)
|
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t quant8, uint16_t * write_data)
|
||||||
{
|
{
|
||||||
uint32_t i=0;
|
uint32_t i=0;
|
||||||
uint16_t addr_write_data[8];
|
uint16_t addr_write_data[0x100];
|
||||||
uint16_t quant16;
|
uint16_t quant16;
|
||||||
|
|
||||||
if(quant8 > 8)
|
quant16 = quant16bitWords(quant8);
|
||||||
|
copy16_to_8(write_data, addr_write_data, quant16);
|
||||||
|
|
||||||
|
for(i = 0; i < quant8; i += 1)
|
||||||
|
{
|
||||||
|
if( ZD24C02A_write_8(Addr+i, addr_write_data+i, 1)) return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{//в этом цикле только полные посылки по 8 байт
|
{//<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 8 <20><><EFBFBD><EFBFBD>
|
||||||
copy16_to_8(write_data, addr_write_data, 4);
|
copy16_to_8(write_data, addr_write_data, 4);
|
||||||
if( ZD24C02A_write_8(Addr+i, addr_write_data, 8)) return 1;
|
if( ZD24C02A_write_8(Addr+i, addr_write_data, 8)) return 1;
|
||||||
write_data += 4;
|
write_data += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i < quant8)
|
if(i < quant8)
|
||||||
{//тут м.б. от 1 до 8 байт
|
{//<EFBFBD><EFBFBD><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
|
||||||
quant16 = quant16bitWords(quant8-i);
|
quant16 = quant16bitWords(quant8-i);
|
||||||
copy16_to_8(write_data, addr_write_data, quant16);
|
copy16_to_8(write_data, addr_write_data, quant16);
|
||||||
if( ZD24C02A_write_8(Addr+i, addr_write_data, (quant8 - i))) return 1;
|
if( ZD24C02A_write_8(Addr+i, addr_write_data, (quant8 - i))) return 1;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,16 +79,16 @@ uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
|
|||||||
if(quant8 > 8)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{//в этом цикле только полные посылки по 8 байт
|
{//<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 8 <20><><EFBFBD><EFBFBD>
|
||||||
if( ZD24C02A_read_8(Addr+i, addr_read_data, 8)) return 1;
|
if( ZD24C02A_read_8(Addr+i, addr_read_data, 8)) return 1;
|
||||||
copy8_to_16(addr_read_data, read_data, 4);
|
copy8_to_16(addr_read_data, read_data, 4);
|
||||||
read_data+=4;
|
read_data+=4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i < quant8)
|
if(i < quant8)
|
||||||
{//тут м.б. от 1 до 8 байт
|
{//<EFBFBD><EFBFBD><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
|
||||||
if( ZD24C02A_read_8(Addr+i, addr_read_data, (quant8 - i))) return 1;
|
if( ZD24C02A_read_8(Addr+i, addr_read_data, (quant8 - i))) return 1;
|
||||||
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//если байт нечётное число, то дополняем до чётного нулём
|
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||||
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
|
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -95,7 +104,7 @@ uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant8, uint16_t * verify_data)
|
|||||||
if(quant8 > 8)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{//в этом цикле только полные посылки по 8 байт
|
{//<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 8 <20><><EFBFBD><EFBFBD>
|
||||||
copy16_to_8(verify_data, addr_vfy_data, 4);
|
copy16_to_8(verify_data, addr_vfy_data, 4);
|
||||||
Err_read = ZD24C02A_verify_8(Addr+i, addr_vfy_data, 8);
|
Err_read = ZD24C02A_verify_8(Addr+i, addr_vfy_data, 8);
|
||||||
if(Err_read) return Err_read;
|
if(Err_read) return Err_read;
|
||||||
@ -103,22 +112,17 @@ uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant8, uint16_t * verify_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i < quant8)
|
if(i < quant8)
|
||||||
{//тут м.б. от 1 до 8 байт
|
{//<EFBFBD><EFBFBD><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
|
||||||
quant16 = quant16bitWords(quant8-i);
|
quant16 = quant16bitWords(quant8-i);
|
||||||
copy16_to_8(verify_data, addr_vfy_data, quant16);
|
copy16_to_8(verify_data, addr_vfy_data, quant16);
|
||||||
Err_read = ZD24C02A_verify_8(Addr+i, addr_vfy_data, (quant8 - i));
|
Err_read = ZD24C02A_verify_8(Addr+i, addr_vfy_data, (quant8 - i));
|
||||||
if(Err_read) return Err_read;
|
if(Err_read) return Err_read;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;// 0 - DONE_SUCCESS ; 1 - FLASH_ERR; 2 - ERROR_VERIFY
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ZD24C02A_read_all(uint16_t byteCount, uint16_t * Array)
|
void ZD24C02A_read_all(uint16_t byteCount, uint16_t * Array)
|
||||||
{
|
{
|
||||||
I2CRead(SlaveAdr, byteCount, true, Array);
|
I2CRead(SlaveAdr, byteCount, true, Array);
|
||||||
|
|||||||
@ -1,14 +1,16 @@
|
|||||||
/*
|
/*
|
||||||
* ZD24C02A.h
|
* ZD24C02A.h
|
||||||
*
|
*
|
||||||
* Created on: 8 ñåíò. 2023 ã.
|
* Created on: 8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||||
* Author: seklyuts
|
* Author: seklyuts
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SRC_ZD24C02A_H_
|
#ifndef SRC_ZD24C02A_H_
|
||||||
#define SRC_ZD24C02A_H_
|
#define SRC_ZD24C02A_H_
|
||||||
|
|
||||||
#define I2C_SLAVE_ADDRESS 0x51U
|
#define I2C_SLAVE_ADDRESS0 0x51U
|
||||||
|
#define I2C_SLAVE_ADDRESS1 0x50U
|
||||||
|
|
||||||
#define I2C_OWN_ADDRESS 0x30U
|
#define I2C_OWN_ADDRESS 0x30U
|
||||||
|
|
||||||
#define ZD24C02A_SIZE 0x80
|
#define ZD24C02A_SIZE 0x80
|
||||||
|
|||||||
@ -8,165 +8,58 @@
|
|||||||
#ifndef CLAINIT_C_
|
#ifndef CLAINIT_C_
|
||||||
#define CLAINIT_C_
|
#define CLAINIT_C_
|
||||||
|
|
||||||
#include "f2838x_device.h"
|
#include "CLAinit.h"
|
||||||
#include "cla_shared.h"
|
|
||||||
#include "f2838x_examples.h"
|
|
||||||
#include "config.h"
|
|
||||||
#include "f28x_project.h"
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Defines
|
|
||||||
//
|
|
||||||
#define WAITSTEP asm(" RPT #255 || NOP")
|
|
||||||
|
|
||||||
//
|
|
||||||
// Globals
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 1 (C) Variables
|
|
||||||
// NOTE: Do not initialize the Message RAM variables globally, they will be
|
|
||||||
// reset during the message ram initialization phase in the CLA memory
|
|
||||||
// configuration routine
|
|
||||||
//
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#pragma DATA_SECTION("CpuToCla1MsgRAM");
|
|
||||||
float fVal;
|
|
||||||
#pragma DATA_SECTION("Cla1ToCpuMsgRAM");
|
|
||||||
float fResult;
|
|
||||||
#else
|
|
||||||
#pragma DATA_SECTION(fVal,"CpuToCla1MsgRAM");
|
|
||||||
float fVal;
|
|
||||||
#pragma DATA_SECTION(fResult,"Cla1ToCpuMsgRAM");
|
|
||||||
float fResult;
|
|
||||||
#endif //__cplusplus
|
|
||||||
float y[BUFFER_SIZE];
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 2 (C) Variables
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 3 (C) Variables
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 4 (C) Variables
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 5 (C) Variables
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 6 (C) Variables
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 7 (C) Variables
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Task 8 (C) Variables
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//Common (C) Variables
|
//Common (C) Variables
|
||||||
//The Exponential table
|
//The Exponential table
|
||||||
//
|
// MAX_SIZE=50
|
||||||
#ifdef __cplusplus
|
// Ïåðåìåííûå, êîòîðûå áóäóò ïåðåäàíû îò CPU ê CLA
|
||||||
#pragma DATA_SECTION("CLADataLS0")
|
#pragma DATA_SECTION(CurrentA, "CpuToCla1MsgRAM");
|
||||||
#else
|
float CurrentA; // Òîê â ôàçå A
|
||||||
#pragma DATA_SECTION(CLAasinTable,"CLADataLS0")
|
#pragma DATA_SECTION(CurrentB, "CpuToCla1MsgRAM");
|
||||||
#endif //__cplusplus
|
float CurrentB; // Òîê â ôàçå B
|
||||||
float CLAasinTable[]={
|
#pragma DATA_SECTION(CurrentC, "CpuToCla1MsgRAM");
|
||||||
0.0, 1.0, 0.0,
|
float CurrentC; // Òîê â ôàçå C
|
||||||
0.000000636202, 0.999877862610, 0.007815361896,
|
#pragma DATA_SECTION(currentCoefK, "CpuToCla1MsgRAM");
|
||||||
0.000005099694, 0.999510644409, 0.015647916155,
|
float currentCoefK; // Êîýôôèöèåíò ïðåîáðàçîâàíèÿ
|
||||||
0.000017268312, 0.998895919094, 0.023514960332,
|
#pragma DATA_SECTION(currentCoefB, "CpuToCla1MsgRAM");
|
||||||
0.000041121765, 0.998029615282, 0.031434003631,
|
float currentCoefB; // Êîýôôèöèåíò ñäâèãà
|
||||||
0.000080794520, 0.996905974725, 0.039422875916,
|
#pragma DATA_SECTION(dataList, "Cla1ToCpuMsgRAM");
|
||||||
0.000140631089, 0.995517492804, 0.047499840611,
|
float dataList[MAX_SIZE]; // Êîýôôèöèåíò ñäâèãà
|
||||||
0.000225244584, 0.993854840311, 0.055683712914,
|
#pragma DATA_SECTION(dataSize, "Cla1ToCpuMsgRAM");
|
||||||
0.000339579512, 0.991906765146, 0.063993984848,
|
int dataSize; // Êîýôôèöèåíò ñäâèãà
|
||||||
0.000488979852, 0.989659972212, 0.072450958820,
|
|
||||||
0.000679263611, 0.987098979366, 0.081075891529,
|
|
||||||
0.000916805182, 0.984205946802, 0.089891150305,
|
|
||||||
0.001208627040, 0.980960476685, 0.098920384204,
|
|
||||||
0.001562502549, 0.977339379243, 0.108188712551,
|
|
||||||
0.001987071928, 0.973316400729, 0.117722933997,
|
|
||||||
0.002491973784, 0.968861907789, 0.127551759665,
|
|
||||||
0.003087995053, 0.963942521723, 0.137706074532,
|
|
||||||
0.003787242692, 0.958520694794, 0.148219231941,
|
|
||||||
0.004603341138, 0.952554219267, 0.159127386977,
|
|
||||||
0.005551660294, 0.945995657913, 0.170469875522,
|
|
||||||
0.006649579796, 0.938791682505, 0.182289647088,
|
|
||||||
0.007916796475, 0.930882303984, 0.194633761132,
|
|
||||||
0.009375683410, 0.922199974574, 0.207553958472,
|
|
||||||
0.011051710808, 0.912668537890, 0.221107321885,
|
|
||||||
0.012973941175, 0.902201997769, 0.235357042896,
|
|
||||||
0.015175614174, 0.890703070035, 0.250373315541,
|
|
||||||
0.017694840102, 0.878061473098, 0.266234382514,
|
|
||||||
0.020575425537, 0.864151902887, 0.283027765009,
|
|
||||||
0.023867860513, 0.848831624374, 0.300851714968,
|
|
||||||
0.027630504055, 0.831937595031, 0.319816937941,
|
|
||||||
0.031931014547, 0.813283013821, 0.340048646894,
|
|
||||||
0.036848083955, 0.792653161200, 0.361689022958,
|
|
||||||
0.042473551274, 0.769800358920, 0.384900179460,
|
|
||||||
0.048914992206, 0.744437830278, 0.409867752228,
|
|
||||||
0.056298910750, 0.716232177740, 0.436805274317,
|
|
||||||
0.064774696786, 0.684794109766, 0.465959540059,
|
|
||||||
0.074519565699, 0.649666934178, 0.497617226179,
|
|
||||||
0.085744766889, 0.610312179660, 0.532113122767,
|
|
||||||
0.098703445606, 0.566091493186, 0.569840443472,
|
|
||||||
0.113700678529, 0.516243664372, 0.611263845480,
|
|
||||||
0.131106395009, 0.459855210927, 0.656936015611,
|
|
||||||
0.151372169232, 0.395822366759, 0.707518998893,
|
|
||||||
0.175053263659, 0.322801460177, 0.763811905770,
|
|
||||||
0.202837883870, 0.239143420888, 0.826787304376,
|
|
||||||
0.235586468765, 0.142806299514, 0.897639596948,
|
|
||||||
0.274385149825, 0.031236880585, 0.977850174820,
|
|
||||||
0.320619535938, -0.098791845166, 1.069276441800,
|
|
||||||
0.376078169620, -0.251407364538, 1.174275392129,
|
|
||||||
0.443100143614, -0.431959397725, 1.295878193174,
|
|
||||||
0.524789871827, -0.647485610469, 1.438041695773,
|
|
||||||
0.625336471263, -0.907400624736, 1.606018804842,
|
|
||||||
0.750500589935, -1.224540947101, 1.806917563896,
|
|
||||||
0.908377657341, -1.616794995066, 2.050569262035,
|
|
||||||
1.110633894185, -2.109729648039, 2.350920816737,
|
|
||||||
1.374584721437, -2.740985157716, 2.728353889708,
|
|
||||||
1.726848242753, -3.567962877198, 3.213722960014,
|
|
||||||
2.210117561056, -4.682006534082, 3.855770086891,
|
|
||||||
2.896554011854, -6.236312386687, 4.735651038017,
|
|
||||||
3.916505715382, -8.505488022524, 5.997790945975,
|
|
||||||
5.526855868703, -12.026617159136, 7.922628470498,
|
|
||||||
8.298197116322, -17.983705080358, 11.123941286820,
|
|
||||||
13.741706072449, -29.488929624542, 17.203344479111,
|
|
||||||
27.202707817485, -57.466598393615, 31.741016484669,
|
|
||||||
83.158101335898, -171.803399517566, 90.149831709374
|
|
||||||
};
|
|
||||||
|
|
||||||
float asin_expected[BUFFER_SIZE]={
|
|
||||||
1.570796, 1.393789, 1.320141, 1.263401, 1.215375,
|
|
||||||
1.172892, 1.134327, 1.098718, 1.065436, 1.034046,
|
//extern static SimpleList list;
|
||||||
1.004232, 0.9757544, 0.9484279, 0.9221048, 0.8966658,
|
|
||||||
0.8720123, 0.8480621, 0.8247454, 0.8020028, 0.7797828,
|
// Ïåðåìåííûå, êîòîðûå áóäóò ïåðåäàíû îò CLA ê CPU
|
||||||
0.7580408, 0.7367374, 0.7158381, 0.6953120, 0.6751316,
|
#pragma DATA_SECTION(currentIa, "Cla1ToCpuMsgRAM");
|
||||||
0.6552721, 0.6357113, 0.6164289, 0.5974064, 0.5786270,
|
volatile float currentIa; // Òîê â ôàçå A
|
||||||
0.5600753, 0.5417370, 0.5235988, 0.5056486, 0.4878751,
|
#pragma DATA_SECTION(currentIb, "Cla1ToCpuMsgRAM");
|
||||||
0.4702678, 0.4528166, 0.4355124, 0.4183464, 0.4013104,
|
volatile float currentIb; // Òîê â ôàçå B
|
||||||
0.3843968, 0.3675981, 0.3509074, 0.3343180, 0.3178237,
|
#pragma DATA_SECTION(currentIc, "Cla1ToCpuMsgRAM");
|
||||||
0.3014185, 0.2850964, 0.2688521, 0.2526802, 0.2365756,
|
volatile float currentIc; // Òîê â ôàçå C
|
||||||
0.2205333, 0.2045484, 0.1886164, 0.1727327, 0.1568929,
|
#pragma DATA_SECTION(currentAlpha, "Cla1ToCpuMsgRAM");
|
||||||
0.1410927, 0.1253278, 0.1095943, 0.09388787, 0.07820469,
|
volatile float currentAlpha; // Òîê â îñè àëüôà
|
||||||
0.06254076, 0.04689218, 0.03125509, 0.01562564
|
#pragma DATA_SECTION(currentBeta, "Cla1ToCpuMsgRAM");
|
||||||
};
|
volatile float currentBeta; // Òîê â îñè áåòà
|
||||||
|
#pragma DATA_SECTION(currentOffset, "Cla1ToCpuMsgRAM");
|
||||||
|
volatile float currentOffset; // Ñìåùåíèå íóëÿ òîêà
|
||||||
|
#pragma DATA_SECTION(currentRms, "Cla1ToCpuMsgRAM");
|
||||||
|
volatile float currentRms; // Ñðåäíåêâàäðàòè÷íîå çíà÷åíèå òîêà
|
||||||
|
#pragma DATA_SECTION(currentLength, "Cla1ToCpuMsgRAM");
|
||||||
|
volatile float currentLength; // Àìïëèòóäíîå çíà÷åíèå òîêà
|
||||||
|
#pragma DATA_SECTION(currentSqrlen, "Cla1ToCpuMsgRAM");
|
||||||
|
volatile float currentSqrlen; // Êâàäðàò àìïëèòóäíîãî çíà÷åíèÿ òîêà
|
||||||
|
|
||||||
uint16_t pass=0;
|
uint16_t pass=0;
|
||||||
uint16_t fail=0;
|
uint16_t fail=0;
|
||||||
|
|
||||||
|
void CLA_Init(){
|
||||||
|
CLA_configClaMemory();
|
||||||
|
CLA_initCpu1Cla1();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// CLA_runTest - Execute CLA task tests for specified vectors
|
// CLA_runTest - Execute CLA task tests for specified vectors
|
||||||
@ -174,25 +67,20 @@ uint16_t fail=0;
|
|||||||
void CLA_runTest(void)
|
void CLA_runTest(void)
|
||||||
{
|
{
|
||||||
int16_t i;
|
int16_t i;
|
||||||
float error;
|
float error;
|
||||||
|
int pass = 0, fail = 0;
|
||||||
|
|
||||||
for(i=0; i < BUFFER_SIZE; i++)
|
for (i = 0; i < BUFFER_SIZE; i++) {
|
||||||
{
|
// Ïåðåäàåì âõîäíûå çíà÷åíèÿ îò CPU ê CLA
|
||||||
fVal= (float)(BUFFER_SIZE - i)/(float)BUFFER_SIZE;
|
CurrentA =1;
|
||||||
Cla1ForceTask1andWait();
|
CurrentB = 1;
|
||||||
|
CurrentC = 1;
|
||||||
|
currentCoefK = 0.1f;
|
||||||
|
currentCoefB=0;
|
||||||
|
Cla1ForceTask1andWait();
|
||||||
|
|
||||||
y[i] = fResult;
|
|
||||||
error = fabsf(asin_expected[i]-y[i]);
|
}
|
||||||
int ii=GpioDataRegs.GPADAT.bit.GPIO31;
|
|
||||||
if(error < 0.1f)
|
|
||||||
{
|
|
||||||
pass++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fail++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// CLA tasks 2-8 are not used in this example
|
// CLA tasks 2-8 are not used in this example
|
||||||
@ -254,19 +142,19 @@ void CLA_configClaMemory(void)
|
|||||||
// First configure the CLA to be the master for LS5 and then
|
// First configure the CLA to be the master for LS5 and then
|
||||||
// set the space to be a program block
|
// set the space to be a program block
|
||||||
//
|
//
|
||||||
MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
|
MemCfgRegs.LSxMSEL.bit.MSEL_LS7 = 1;
|
||||||
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 1;
|
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS7 = 1;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Next configure LS0RAM and LS1RAM as data spaces for the CLA
|
// Next configure LS0RAM and LS1RAM as data spaces for the CLA
|
||||||
// First configure the CLA to be the master for LS0(1) and then
|
// First configure the CLA to be the master for LS0(1) and then
|
||||||
// set the spaces to be code blocks
|
// set the spaces to be code blocks
|
||||||
//
|
//
|
||||||
MemCfgRegs.LSxMSEL.bit.MSEL_LS6 = 1;
|
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
|
||||||
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS6 = 0;
|
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
|
||||||
|
|
||||||
MemCfgRegs.LSxMSEL.bit.MSEL_LS7 = 1;
|
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
|
||||||
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS7 = 0;
|
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
|
||||||
|
|
||||||
EDIS;
|
EDIS;
|
||||||
}
|
}
|
||||||
@ -283,7 +171,7 @@ __interrupt void cla1Isr1 ()
|
|||||||
//
|
//
|
||||||
// Uncomment to halt debugger and stop here
|
// Uncomment to halt debugger and stop here
|
||||||
//
|
//
|
||||||
asm(" ESTOP0");
|
// asm(" ESTOP0");
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -394,6 +282,10 @@ void CLA_initCpu1Cla1(void)
|
|||||||
PieVectTable.CLA1_7_INT = &cla1Isr7;
|
PieVectTable.CLA1_7_INT = &cla1Isr7;
|
||||||
PieVectTable.CLA1_8_INT = &cla1Isr8;
|
PieVectTable.CLA1_8_INT = &cla1Isr8;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Enable CLA Task1 to SDFM1 Iterput
|
||||||
|
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1 = 95U;
|
||||||
//
|
//
|
||||||
// Enable CLA interrupts at the group and subgroup levels
|
// Enable CLA interrupts at the group and subgroup levels
|
||||||
//
|
//
|
||||||
|
|||||||
@ -8,6 +8,35 @@
|
|||||||
#ifndef SRC_PERIPHERALS_CLAINIT_H_
|
#ifndef SRC_PERIPHERALS_CLAINIT_H_
|
||||||
#define SRC_PERIPHERALS_CLAINIT_H_
|
#define SRC_PERIPHERALS_CLAINIT_H_
|
||||||
|
|
||||||
|
#include "f2838x_device.h"
|
||||||
|
#include "cla_shared.h"
|
||||||
|
#include "f2838x_examples.h"
|
||||||
|
#include "f28x_project.h"
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Defines
|
||||||
|
//
|
||||||
|
#define WAITSTEP asm(" RPT #255 || NOP")
|
||||||
|
#define MAX_SIZE 50 // Ìàêñèìàëüíûé ðàçìåð ñïèñêà
|
||||||
|
//
|
||||||
|
// Globals
|
||||||
|
//
|
||||||
|
// Function prototypes
|
||||||
|
void CLA_Init();
|
||||||
|
void CLA_runTest(void);
|
||||||
|
void CLA_configClaMemory(void);
|
||||||
|
void CLA_initCpu1Cla1(void);
|
||||||
|
|
||||||
|
// CLA1 ISR prototypes
|
||||||
|
__interrupt void cla1Isr1();
|
||||||
|
__interrupt void cla1Isr2();
|
||||||
|
__interrupt void cla1Isr3();
|
||||||
|
__interrupt void cla1Isr4();
|
||||||
|
__interrupt void cla1Isr5();
|
||||||
|
__interrupt void cla1Isr6();
|
||||||
|
__interrupt void cla1Isr7();
|
||||||
|
__interrupt void cla1Isr8();
|
||||||
|
|
||||||
|
|
||||||
#endif /* SRC_PERIPHERALS_CLAINIT_H_ */
|
#endif /* SRC_PERIPHERALS_CLAINIT_H_ */
|
||||||
|
|||||||
@ -1,43 +1,10 @@
|
|||||||
//#############################################################################
|
//#############################################################################
|
||||||
// \file cla_ex1_asin_cla.cla
|
// \file cla_ex1_asin_cla.cla
|
||||||
//
|
//
|
||||||
// \brief Arc Sine Example
|
// \brief SDFM Example
|
||||||
//
|
//
|
||||||
//#############################################################################
|
//#############################################################################
|
||||||
//
|
|
||||||
//
|
|
||||||
// $Copyright:
|
|
||||||
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in the
|
|
||||||
// documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of Texas Instruments Incorporated nor the names of
|
|
||||||
// its contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
// $
|
|
||||||
//#############################################################################
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Included Files
|
// Included Files
|
||||||
@ -45,6 +12,7 @@
|
|||||||
#include "cla_shared.h"
|
#include "cla_shared.h"
|
||||||
#include "f28x_project.h"
|
#include "f28x_project.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Defines
|
// Defines
|
||||||
//
|
//
|
||||||
@ -52,77 +20,121 @@
|
|||||||
//
|
//
|
||||||
// Globals
|
// Globals
|
||||||
//
|
//
|
||||||
// Note that the globals defined in the .cla source are global to the cla source
|
|
||||||
// file. i.e. they may be shared across tasks. All of the data shared between
|
|
||||||
// the CLA and the C28x CPU must be defined in the C (or C++) code, and not the
|
|
||||||
// CLA code.
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
// Function Definitions
|
#define MAX_SIZE 50 // Ěŕęńčěŕëüíűé đŕçěĺđ ńďčńęŕ
|
||||||
//
|
#define SDFM_VOLTAGE_MAX 320.0 //mV
|
||||||
//Task 1 : Calculate asin(X)
|
#define R_BRAKE 220.0 //mOM
|
||||||
// Description:
|
#define R_DRW 4.0 //mOM
|
||||||
// Step(1): Calculate absolute of the input X
|
#define R_VDC 806.0 //Om
|
||||||
//
|
#define R_DEL_VDC 2000000.0 //Om
|
||||||
// Step(2): Use the upper 6-bits of input "X" value as an
|
|
||||||
// index into the table to obtain the coefficients
|
#define BIT_MAX 32768//4096
|
||||||
// for a second order equation:
|
#define IMAX_A 25.0 //A
|
||||||
//
|
#define IMAX (IMAX_A*BIT_MAX/FACTOR_CURRENT_MOTOR_A)
|
||||||
// _FPUasinTable:
|
|
||||||
// CoeffA0[0]
|
#define FACTOR_VDC (SDFM_VOLTAGE_MAX/R_VDC*(R_DEL_VDC+R_VDC)/1000)
|
||||||
// CoeffA1[0]
|
|
||||||
// CoeffA2[0]
|
#define FACTOR_CURRENT_BRAKE_A (SDFM_VOLTAGE_MAX/R_BRAKE) //A
|
||||||
// .
|
#define FACTOR_CURRENT_MOTOR_A (SDFM_VOLTAGE_MAX/R_DRW) //A
|
||||||
// .
|
|
||||||
// CoeffA0[63]
|
#define FACTOR_CURRENT_BRAKE (FACTOR_CURRENT_BRAKE_A/BIT_MAX)
|
||||||
// CoeffA1[63]
|
#define FACTOR_CURRENT_MOTOR (FACTOR_CURRENT_MOTOR_A/BIT_MAX)
|
||||||
// CoeffA2[63]
|
|
||||||
//
|
|
||||||
// Step(3): Calculate the angle using the following equation:
|
|
||||||
//
|
float mySqrt(float number) {
|
||||||
// arctan(Ratio) = A0 + A1*Ratio + A2*Ratio*Ratio
|
if (number < 0) {
|
||||||
// arctan(Ratio) = A0 + Ratio(A1 + A2*Ratio)
|
// Âîçâđŕůŕĺě NaN äë˙ îňđčöŕňĺëüíűő ÷čńĺë
|
||||||
//
|
return -1.0f; // Čëč ěîćíî čńďîëüçîâŕňü ńďĺöčŕëüíîĺ çíŕ÷ĺíčĺ äë˙ îáîçíŕ÷ĺíč˙ îřčáęč
|
||||||
// Step(4): The final angle is determined as follows:
|
}
|
||||||
//
|
|
||||||
// if( X < 0 )
|
if (number == 0) {
|
||||||
// Angle = -Angle
|
return 0; // Ęîđĺíü čç íóë˙
|
||||||
|
}
|
||||||
|
|
||||||
|
float guess = number / 2.0f; // Íŕ÷ŕëüíîĺ ďđĺäďîëîćĺíčĺ
|
||||||
|
float epsilon = 0.00001f; // Ňî÷íîńňü
|
||||||
|
|
||||||
|
while (fabs(guess * guess - number) >= epsilon) {
|
||||||
|
guess = (guess + number / guess) / 2.0f; // Îáíîâë˙ĺě ďđĺäďîëîćĺíčĺ
|
||||||
|
}
|
||||||
|
|
||||||
|
return guess;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ôóíęöč˙ äë˙ äîáŕâëĺíč˙ çíŕ÷ĺíč˙ â ńďčńîę
|
||||||
|
void addToList(float value) {
|
||||||
|
int i;
|
||||||
|
if (dataSize < MAX_SIZE) {
|
||||||
|
dataList[dataSize++] = value;
|
||||||
|
} else {
|
||||||
|
for ( i = 1; i < MAX_SIZE; ++i) {
|
||||||
|
dataList[i - 1] = dataList[i];
|
||||||
|
}
|
||||||
|
dataList[MAX_SIZE - 1] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ôóíęöč˙ äë˙ ďîëó÷ĺíč˙ ńóěěű âńĺő çíŕ÷ĺíčé
|
||||||
|
float sumList() {
|
||||||
|
int i;
|
||||||
|
float total = 0.0f;
|
||||||
|
for ( i = 0; i < dataSize; ++i) {
|
||||||
|
total += dataList[i];
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ôóíęöč˙ äë˙ ďîëó÷ĺíč˙ ňĺęóůĺăî đŕçěĺđŕ ńďčńęŕ
|
||||||
|
int getListSize() {
|
||||||
|
return dataSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ôóíęöč˙ äë˙ ďđĺîáđŕçîâŕíč˙ ęîäŕ â ňîę
|
||||||
|
void convertCurrentToAmps(float currentCode, float offset, float factor, float* current) {
|
||||||
|
*current = (currentCode * factor) + offset; // Čńďîëüçóĺě óęŕçŕňĺëü äë˙ čçěĺíĺíč˙ çíŕ÷ĺíč˙
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ôóíęöč˙ äë˙ ďîäń÷ĺňŕ îńíîâíűő ďŕđŕěĺňđîâ
|
||||||
|
void calculateMainParameters(float currentA, float currentB, float currentC,
|
||||||
|
float* currentAlpha, float* currentBeta, float* currentOffset) {
|
||||||
|
*currentAlpha = currentA;
|
||||||
|
*currentBeta = (currentA + 2 * currentB) * 0.577350269f;
|
||||||
|
*currentOffset = currentA + currentB + currentC;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ôóíęöč˙ äë˙ ďîäń÷ĺňŕ ńňŕňčńňč÷ĺńęčő ďŕđŕěĺňđîâ
|
||||||
|
void calculateStatisticalParameters(float a, float b,
|
||||||
|
float* currentRms, float* currentLength, float* currentSqrlen) {
|
||||||
|
*currentSqrlen = (a * a + b * b);
|
||||||
|
addToList(*currentSqrlen);
|
||||||
|
addToList( *currentSqrlen); // Äîáŕâë˙ĺě çíŕ÷ĺíčĺ â ńďčńîę
|
||||||
|
*currentRms = mySqrt(sumList() / getListSize());
|
||||||
|
*currentLength = mySqrt(a * a + b * b); // Čńďîëüçóĺě a č b äë˙ âű÷čńëĺíč˙ äëčíű
|
||||||
|
|
||||||
|
}
|
||||||
__interrupt void Cla1Task1 ( void )
|
__interrupt void Cla1Task1 ( void )
|
||||||
{
|
{
|
||||||
//
|
// Äë˙ đŕáîňű ôóíęöčč íóćíî ďĺđĺäŕňü âíĺříčĺ äŕíííűĺ â CLA
|
||||||
//Local Variables
|
|
||||||
//
|
|
||||||
int xTblIdx; //integer valued Table index
|
|
||||||
float A0,A1,A2; //Table coefficients
|
|
||||||
float *entry;
|
|
||||||
float result;
|
|
||||||
|
|
||||||
//
|
|
||||||
//Preprocessing
|
|
||||||
//
|
|
||||||
__mdebugstop();
|
|
||||||
xTblIdx = fVal * TABLE_SIZE_M_1; //convert table index to u16-bits
|
|
||||||
xTblIdx = xTblIdx * 3; //Table is ordered as 3 32-bit coefficients, the
|
|
||||||
//index points to these triplets, hence the *3*sizeof(float)
|
|
||||||
entry = &CLAasinTable[xTblIdx];
|
|
||||||
A0 = *entry++;
|
|
||||||
A1 = *entry++;
|
|
||||||
A2 = *entry;
|
|
||||||
|
|
||||||
|
|
||||||
result = A0 + fVal*(A1 + A2*fVal);
|
// Ďđĺîáđŕçîâŕíčĺ ňîęîâ
|
||||||
|
convertCurrentToAmps(CurrentA, currentCoefB, currentCoefK, ¤tIa);
|
||||||
|
convertCurrentToAmps(CurrentB, currentCoefB, currentCoefK, ¤tIb);
|
||||||
|
convertCurrentToAmps(CurrentC, currentCoefB, currentCoefK, ¤tIc);
|
||||||
|
|
||||||
//
|
// Ďîäń÷ĺň îńíîâíűő ďŕđŕěĺňđîâ
|
||||||
//Post processing
|
calculateMainParameters(currentIa, currentIb, currentIc, ¤tAlpha, ¤tBeta, ¤tOffset);
|
||||||
//
|
|
||||||
if(fVal < 0)
|
|
||||||
{
|
|
||||||
result = - result;
|
|
||||||
}
|
|
||||||
int ii=GpioDataRegs.GPADAT.bit.GPIO31;
|
|
||||||
|
|
||||||
fResult = ii;
|
// Ďîäń÷ĺň ńňŕňčńňč÷ĺńęčő ďŕđŕěĺňđîâ
|
||||||
|
calculateStatisticalParameters(currentAlpha, currentBeta, ¤tRms, ¤tLength, ¤tSqrlen);
|
||||||
|
|
||||||
|
// Äîáŕâëĺíčĺ äŕííűő â ńďčńîę
|
||||||
|
addToList(currentLength * currentLength);
|
||||||
|
currentIa=55;
|
||||||
|
currentIb=66;
|
||||||
|
currentIc=77;
|
||||||
}
|
}
|
||||||
|
|
||||||
interrupt void Cla1Task2 ( void )
|
interrupt void Cla1Task2 ( void )
|
||||||
|
|||||||
@ -6,42 +6,6 @@
|
|||||||
//
|
//
|
||||||
// TITLE: CLA arcsine example header file.
|
// TITLE: CLA arcsine example header file.
|
||||||
//
|
//
|
||||||
//#############################################################################
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// $Copyright:
|
|
||||||
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in the
|
|
||||||
// documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of Texas Instruments Incorporated nor the names of
|
|
||||||
// its contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
// $
|
|
||||||
//#############################################################################
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Included Files
|
// Included Files
|
||||||
//
|
//
|
||||||
@ -62,16 +26,33 @@ extern "C" {
|
|||||||
#define PI 3.141592653589
|
#define PI 3.141592653589
|
||||||
#define INV2PI 0.159154943
|
#define INV2PI 0.159154943
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Globals
|
// Globals
|
||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
//Task 1 (C) Variables
|
//Task 1 (C) Variables
|
||||||
//
|
//
|
||||||
extern float y[]; //Result vector
|
#define MAX_SIZE 50
|
||||||
extern float fVal; //Holds the input argument to the task
|
extern float dataList[MAX_SIZE];
|
||||||
extern float fResult; //The arsine of the input argument
|
extern float CurrentA;
|
||||||
|
extern float CurrentB;
|
||||||
|
extern float CurrentC;
|
||||||
|
extern float currentCoefK;
|
||||||
|
extern float currentCoefB;
|
||||||
|
extern int dataSize;
|
||||||
|
// Îïðåäåëåíèå âíåøíèõ ïåðåìåííûõ îò CLA
|
||||||
|
extern volatile float currentIa; // Òîê â ôàçå A
|
||||||
|
extern volatile float currentIb; // Òîê â ôàçå B
|
||||||
|
extern volatile float currentIc; // Òîê â ôàçå C
|
||||||
|
|
||||||
|
extern volatile float currentAlpha; // Òîê â îñè àëüôà
|
||||||
|
extern volatile float currentBeta; // Òîê â îñè áåòà
|
||||||
|
extern volatile float currentOffset; // Ñìåùåíèå íóëÿ òîêà
|
||||||
|
extern volatile float currentRms; // Ñðåäíåêâàäðàòè÷íîå çíà÷åíèå òîêà
|
||||||
|
extern volatile float currentLength; // Àìïëèòóäíîå çíà÷åíèå òîêà
|
||||||
|
extern volatile float currentSqrlen; // Êâàäðàò àìïëèòóäíîãî çíà÷åíèÿ òîêà
|
||||||
|
|
||||||
//
|
//
|
||||||
//Task 2 (C) Variables
|
//Task 2 (C) Variables
|
||||||
|
|||||||
@ -31,27 +31,28 @@ volatile uint16_t TimerBase = PERIOD_TIMER_BASE;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void PWM_ABC_StopAllClose(void)
|
void PWM_ABC_StopAllClose(void)
|
||||||
{
|
{
|
||||||
EALLOW;
|
EALLOW;
|
||||||
EPwmRegs[PWM_A]->TZCTL.bit.TZA = 2;
|
EPwmRegs[PWM_A]->TZFRC.all = 4;
|
||||||
EPwmRegs[PWM_A]->TZCTL.bit.TZB = 2;
|
EPwmRegs[PWM_B]->TZFRC.all = 4;
|
||||||
EPwmRegs[PWM_B]->TZCTL.bit.TZA = 2;
|
EPwmRegs[PWM_C]->TZFRC.all = 4;
|
||||||
EPwmRegs[PWM_B]->TZCTL.bit.TZB = 2;
|
// EPwmRegs[PWM_A]->TZCTL.bit.TZA = 2;
|
||||||
EPwmRegs[PWM_C]->TZCTL.bit.TZA = 2;
|
// EPwmRegs[PWM_A]->TZCTL.bit.TZB = 2;
|
||||||
EPwmRegs[PWM_C]->TZCTL.bit.TZB = 2;
|
// EPwmRegs[PWM_B]->TZCTL.bit.TZA = 2;
|
||||||
|
// EPwmRegs[PWM_B]->TZCTL.bit.TZB = 2;
|
||||||
|
// EPwmRegs[PWM_C]->TZCTL.bit.TZA = 2;
|
||||||
|
// EPwmRegs[PWM_C]->TZCTL.bit.TZB = 2;
|
||||||
EDIS;
|
EDIS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PWM_ABC_StartOut(void)
|
void PWM_ABC_StartOut(void)
|
||||||
{
|
{
|
||||||
EALLOW;
|
EALLOW;
|
||||||
EPwmRegs[PWM_A]->TZCTL.bit.TZA = 3;
|
EPwmRegs[PWM_A]->TZCLR.all = 0x4;//
|
||||||
EPwmRegs[PWM_A]->TZCTL.bit.TZB = 3;
|
EPwmRegs[PWM_B]->TZCLR.all = 0x4;//
|
||||||
EPwmRegs[PWM_B]->TZCTL.bit.TZA = 3;
|
EPwmRegs[PWM_C]->TZCLR.all = 0x4;//
|
||||||
EPwmRegs[PWM_B]->TZCTL.bit.TZB = 3;
|
|
||||||
EPwmRegs[PWM_C]->TZCTL.bit.TZA = 3;
|
|
||||||
EPwmRegs[PWM_C]->TZCTL.bit.TZB = 3;
|
|
||||||
EDIS;
|
EDIS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +81,81 @@ void PWM_ABC_Start(uint16_t Num)
|
|||||||
EDIS;
|
EDIS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Нужно сформировать с соответствующих каналов SDFM (трёх каналов, на которых происходит измерение токов)
|
||||||
|
* модулей сигналы CEVT1 и/или CEVT2, выбрав значения CEVT1SEL и CEVT2SEL и настроив границы
|
||||||
|
* SDFLTxCMPH1.bit.HLT и SDFLTxCMPL1.bit.LLT (или SDFLTxCMPH2.bit.HLT и SDFLTxCMPL2.bit.LLT).
|
||||||
|
*
|
||||||
|
* На CPU1 при помощи EPwmXbarRegs (см. стр. 2145 TRM) подключить эти выходы на входы
|
||||||
|
* TRIPn (можно черех MUX завести сразу несколько сигналов SDxFLTy.CEVT1_OR_CEVT2 на один TRIPn,
|
||||||
|
* где n = 4..12, x = 1..2, y = 1..4)
|
||||||
|
*
|
||||||
|
* На блоке PWM подключить TRIPn к блоку "Digital Compare Signals" (стр 2917 TRM)
|
||||||
|
* через регистры DCTRIPSEL соответствующих PWM-модулей (трёх модулей, отвечающих за формирование
|
||||||
|
* напряжения мотора). Если настроено верно, то изменения сигналов можно видеть в DCACTL и/или DCBCTL
|
||||||
|
* в битах EVT1LAT и/или EVT2LAT.
|
||||||
|
*/
|
||||||
|
void PWMTripInit(void)
|
||||||
|
{
|
||||||
|
EALLOW;
|
||||||
|
EPwmRegs[PWM_A]->DCTRIPSEL.all = 0x3333;//3 - TRIPIN4
|
||||||
|
EPwmRegs[PWM_B]->DCTRIPSEL.all = 0x3333;//3 - TRIPIN4
|
||||||
|
EPwmRegs[PWM_C]->DCTRIPSEL.all = 0x3333;//3 - TRIPIN4
|
||||||
|
EPwmRegs[PWM_A]->TZDCSEL.all = 0b010010010010;
|
||||||
|
EPwmRegs[PWM_B]->TZDCSEL.all = 0b010010010010;
|
||||||
|
EPwmRegs[PWM_C]->TZDCSEL.all = 0b010010010010;
|
||||||
|
EPwmRegs[PWM_A]->TZSEL.bit.DCAEVT1 = 1;
|
||||||
|
EPwmRegs[PWM_B]->TZSEL.bit.DCAEVT1 = 1;
|
||||||
|
EPwmRegs[PWM_C]->TZSEL.bit.DCAEVT1 = 1;
|
||||||
|
EPwmRegs[PWM_A]->TZSEL.bit.DCBEVT1 = 1;
|
||||||
|
EPwmRegs[PWM_B]->TZSEL.bit.DCBEVT1 = 1;
|
||||||
|
EPwmRegs[PWM_C]->TZSEL.bit.DCBEVT1 = 1;
|
||||||
|
EPwmRegs[PWM_A]->TZSEL.bit.DCAEVT2 = 0;
|
||||||
|
EPwmRegs[PWM_B]->TZSEL.bit.DCAEVT2 = 0;
|
||||||
|
EPwmRegs[PWM_C]->TZSEL.bit.DCAEVT2 = 0;
|
||||||
|
EPwmRegs[PWM_A]->TZSEL.bit.DCBEVT2 = 0;
|
||||||
|
EPwmRegs[PWM_B]->TZSEL.bit.DCBEVT2 = 0;
|
||||||
|
EPwmRegs[PWM_C]->TZSEL.bit.DCBEVT2 = 0;
|
||||||
|
EPwmRegs[PWM_A]->TZCTL.bit.DCAEVT1 = 2; //Force EPWMxA to a low state.
|
||||||
|
EPwmRegs[PWM_B]->TZCTL.bit.DCAEVT1 = 2; //Force EPWMxA to a low state.
|
||||||
|
EPwmRegs[PWM_C]->TZCTL.bit.DCAEVT1 = 2; //Force EPWMxA to a low state.
|
||||||
|
EPwmRegs[PWM_A]->TZCTL.bit.DCBEVT1 = 2; //Force EPWMxB to a low state.
|
||||||
|
EPwmRegs[PWM_B]->TZCTL.bit.DCBEVT1 = 2; //Force EPWMxB to a low state.
|
||||||
|
EPwmRegs[PWM_C]->TZCTL.bit.DCBEVT1 = 2; //Force EPWMxB to a low state.
|
||||||
|
EPwmRegs[PWM_A]->TZCTL.bit.DCAEVT2 = 2; //Force EPWMxA to a low state.
|
||||||
|
EPwmRegs[PWM_B]->TZCTL.bit.DCAEVT2 = 2; //Force EPWMxA to a low state.
|
||||||
|
EPwmRegs[PWM_C]->TZCTL.bit.DCAEVT2 = 2; //Force EPWMxA to a low state.
|
||||||
|
EPwmRegs[PWM_A]->TZCTL.bit.DCBEVT2 = 2; //Force EPWMxB to a low state.
|
||||||
|
EPwmRegs[PWM_B]->TZCTL.bit.DCBEVT2 = 2; //Force EPWMxB to a low state.
|
||||||
|
EPwmRegs[PWM_C]->TZCTL.bit.DCBEVT2 = 2; //Force EPWMxB to a low state.
|
||||||
|
EPwmRegs[PWM_A]->TZOSTCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_B]->TZOSTCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_C]->TZOSTCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_A]->DCACTL.bit.EVT2LATSEL = 1;
|
||||||
|
EPwmRegs[PWM_B]->DCACTL.bit.EVT2LATSEL = 1;
|
||||||
|
EPwmRegs[PWM_C]->DCACTL.bit.EVT2LATSEL = 1;
|
||||||
|
EPwmRegs[PWM_A]->DCACTL.bit.EVT1LATSEL = 1;
|
||||||
|
EPwmRegs[PWM_B]->DCACTL.bit.EVT1LATSEL = 1;
|
||||||
|
EPwmRegs[PWM_C]->DCACTL.bit.EVT1LATSEL = 1;
|
||||||
|
|
||||||
|
// EPwmRegs[PWM_A]->TZFRC.bit.DCAEVT1 = 1;
|
||||||
|
// EPwmRegs[PWM_B]->TZFRC.bit.DCAEVT1 = 1;
|
||||||
|
// EPwmRegs[PWM_C]->TZFRC.bit.DCAEVT1 = 1;
|
||||||
|
EDIS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PWM_clrTripEvnt(void)
|
||||||
|
{
|
||||||
|
EALLOW;
|
||||||
|
EPwmRegs[PWM_A]->TZCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_B]->TZCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_C]->TZCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_A]->TZOSTCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_B]->TZOSTCLR.all = 0xFFFF;//
|
||||||
|
EPwmRegs[PWM_C]->TZOSTCLR.all = 0xFFFF;//
|
||||||
|
EDIS;
|
||||||
|
}
|
||||||
|
|
||||||
void PWMAllInit(void)
|
void PWMAllInit(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -28,7 +28,8 @@
|
|||||||
#define SDFM_DELAY_mkS 50.0 //mkS
|
#define SDFM_DELAY_mkS 50.0 //mkS
|
||||||
#define SDFM_DELAY (SDFM_DELAY_mkS*SYS_PWM_FREQUENCY/1000000)
|
#define SDFM_DELAY (SDFM_DELAY_mkS*SYS_PWM_FREQUENCY/1000000)
|
||||||
|
|
||||||
#define PERIOD_2 (PERIOD_MOTOR/2.0)
|
#define PERIOD_DIV2 (PERIOD_MOTOR/2.0)
|
||||||
|
#define PERIOD_MAX (PERIOD_MOTOR*1.25)
|
||||||
//#define PWM_MAX (PERIOD_MOTOR - EPWM_DB)
|
//#define PWM_MAX (PERIOD_MOTOR - EPWM_DB)
|
||||||
//#define PWM_MIN EPWM_DB*2
|
//#define PWM_MIN EPWM_DB*2
|
||||||
#define INDEPENDED 1
|
#define INDEPENDED 1
|
||||||
@ -73,7 +74,7 @@ void InitEPwm3Example(void);
|
|||||||
void InitEPwm4Example(void);
|
void InitEPwm4Example(void);
|
||||||
void InitEPwm5Example(void);
|
void InitEPwm5Example(void);
|
||||||
void InitEPwm6Example(void);
|
void InitEPwm6Example(void);
|
||||||
|
void PWMTripInit(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
* Author: seklyuts
|
* Author: seklyuts
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <pwm_init.h>
|
|
||||||
#include "f28x_project.h"
|
#include "f28x_project.h"
|
||||||
#include "frm_uart.h"
|
#include "frm_uart.h"
|
||||||
#include "gpio_init.h"
|
#include "gpio_init.h"
|
||||||
@ -39,8 +39,8 @@ typedef struct
|
|||||||
|
|
||||||
|
|
||||||
volatile uint16_t PeriodPWM[2] = {PERIOD_MOTOR, PERIOD_MOTOR};
|
volatile uint16_t PeriodPWM[2] = {PERIOD_MOTOR, PERIOD_MOTOR};
|
||||||
volatile uint16_t PeriodPWM_2 = PERIOD_2;
|
volatile uint16_t PeriodPWM_2 = PERIOD_DIV2;
|
||||||
volatile strPWMABC PWM_motor = {PERIOD_2, PERIOD_2, PERIOD_2};
|
volatile strPWMABC PWM_motor = {PERIOD_DIV2, PERIOD_DIV2, PERIOD_DIV2};
|
||||||
|
|
||||||
int16_t A_proc,B_proc,C_proc;
|
int16_t A_proc,B_proc,C_proc;
|
||||||
uint16_t PWM_Vent = PERIOD_FAN;
|
uint16_t PWM_Vent = PERIOD_FAN;
|
||||||
@ -55,8 +55,8 @@ void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC, float Udc, uint16
|
|||||||
{
|
{
|
||||||
if(Mode == OffMode)
|
if(Mode == OffMode)
|
||||||
{
|
{
|
||||||
if(PeriodPWM[0] < PERIOD_2) PeriodPWM[0]=PERIOD_2;
|
if(PeriodPWM[0] < PERIOD_DIV2) PeriodPWM[0]=PERIOD_DIV2;
|
||||||
if(PeriodPWM[0] > PERIOD_MOTOR) PeriodPWM[0]=PERIOD_MOTOR;
|
if(PeriodPWM[0] > PERIOD_MAX) PeriodPWM[0]=PERIOD_MAX;
|
||||||
PeriodPWM[1] = PeriodPWM[0];
|
PeriodPWM[1] = PeriodPWM[0];
|
||||||
vectorRegKoeffRecalc(PeriodPWM[0]/PERIOD_MOTOR);
|
vectorRegKoeffRecalc(PeriodPWM[0]/PERIOD_MOTOR);
|
||||||
EALLOW;
|
EALLOW;
|
||||||
@ -168,9 +168,9 @@ __interrupt void epwm2_isr(void)
|
|||||||
AdcStartSet();
|
AdcStartSet();
|
||||||
BissStartSet();
|
BissStartSet();
|
||||||
PWM_ABC_StopAllClose();
|
PWM_ABC_StopAllClose();
|
||||||
PWM_motor.UA = PERIOD_2;
|
PWM_motor.UA = PERIOD_DIV2;
|
||||||
PWM_motor.UB = PERIOD_2;
|
PWM_motor.UB = PERIOD_DIV2;
|
||||||
PWM_motor.UC = PERIOD_2;
|
PWM_motor.UC = PERIOD_DIV2;
|
||||||
vectorFault();
|
vectorFault();
|
||||||
EPwmRegs[PWM_FAN]->CMPA.bit.CMPA = PERIOD_MOTOR - PWM_Vent;
|
EPwmRegs[PWM_FAN]->CMPA.bit.CMPA = PERIOD_MOTOR - PWM_Vent;
|
||||||
// EPwmRegs[3]->CMPB.bit.CMPB = PERIOD_MOTOR - PWM_Chop;
|
// EPwmRegs[3]->CMPB.bit.CMPB = PERIOD_MOTOR - PWM_Chop;
|
||||||
|
|||||||
@ -11,6 +11,7 @@
|
|||||||
#include "gpio_init.h"
|
#include "gpio_init.h"
|
||||||
#include "sdfm.h"
|
#include "sdfm.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
|
#include "CLAinit.h"
|
||||||
#include "frm_uart.h"
|
#include "frm_uart.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -51,6 +52,9 @@ int16_t Filter7_Result[MAX_SAMPLES];
|
|||||||
#pragma DATA_SECTION(Filter6_Result,"Filter3_RegsFile");
|
#pragma DATA_SECTION(Filter6_Result,"Filter3_RegsFile");
|
||||||
#pragma DATA_SECTION(Filter7_Result,"Filter4_RegsFile");
|
#pragma DATA_SECTION(Filter7_Result,"Filter4_RegsFile");
|
||||||
|
|
||||||
|
//Ñòðóêòóðà [0]- áèò íîìåð áëîêà SDFM [1-8] - áèòû ïðè÷èíû ïðåðûâàíèÿÿ
|
||||||
|
int16_t iterputErrorSost=0;
|
||||||
|
|
||||||
int16_t * FilterResult[8] = {Filter0_Result, Filter1_Result, Filter2_Result, Filter3_Result, Filter4_Result, Filter5_Result, Filter6_Result, Filter7_Result};
|
int16_t * FilterResult[8] = {Filter0_Result, Filter1_Result, Filter2_Result, Filter3_Result, Filter4_Result, Filter5_Result, Filter6_Result, Filter7_Result};
|
||||||
|
|
||||||
union SDCPARM1_REG * SDCPARM_Reg_arr[8] = {
|
union SDCPARM1_REG * SDCPARM_Reg_arr[8] = {
|
||||||
@ -88,11 +92,23 @@ volatile int16 * SdfmReadData[8] = {
|
|||||||
(volatile int16 *)((Uint16)0x5EC7),
|
(volatile int16 *)((Uint16)0x5EC7),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
volatile int16 * SdfmReadFiltr[8] = {
|
||||||
|
(volatile int16 *)((Uint16)0x5E1A),
|
||||||
|
(volatile int16 *)((Uint16)0x5E2A),
|
||||||
|
(volatile int16 *)((Uint16)0x5E3A),
|
||||||
|
(volatile int16 *)((Uint16)0x5E4A),
|
||||||
|
(volatile int16 *)((Uint16)0x5E9A),
|
||||||
|
(volatile int16 *)((Uint16)0x5EAA),
|
||||||
|
(volatile int16 *)((Uint16)0x5EBA),
|
||||||
|
(volatile int16 *)((Uint16)0x5ECA),
|
||||||
|
};
|
||||||
|
|
||||||
#define WAIT_STABILITY_SDFM 6
|
#define WAIT_STABILITY_SDFM 6
|
||||||
|
|
||||||
int16_t sdfmAdc[8] = {0,0,0,0,0,0,0,0};
|
int16_t sdfmAdc[8] = {0,0,0,0,0,0,0,0};
|
||||||
|
int16_t sdfmFiltr[8]= {0,0,0,0,0,0,0,0};
|
||||||
int16_t sdfmAdcErr[8] = {0,0,0,0,0,0,0,0};
|
int16_t sdfmAdcErr[8] = {0,0,0,0,0,0,0,0};
|
||||||
int16_t sdfmOffset[8] = {0,0,0,0,0,-10,0,0};
|
int16_t sdfmOffset[8] = {0,0,-50,0,0,0,0,0};
|
||||||
uint16_t startInitCurrent = 0;
|
uint16_t startInitCurrent = 0;
|
||||||
uint16_t initDone[8] = {WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM};
|
uint16_t initDone[8] = {WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM};
|
||||||
uint16_t AllInitDone =0;
|
uint16_t AllInitDone =0;
|
||||||
@ -193,7 +209,7 @@ void SdfmInitInterruptEn(void)
|
|||||||
|
|
||||||
void SdfmInit(void)
|
void SdfmInit(void)
|
||||||
{
|
{
|
||||||
uint16_t HLT, LLT;
|
uint16_t HLT, LLT, Max, Min;
|
||||||
//
|
//
|
||||||
// Configure SDFM type to 0
|
// Configure SDFM type to 0
|
||||||
//
|
//
|
||||||
@ -213,7 +229,14 @@ void SdfmInit(void)
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Comparator Module
|
// Comparator Module
|
||||||
//
|
// Ñ<>тр 3210
|
||||||
|
// HLT1
|
||||||
|
//When comparator data > = (SDFLTxCMPH1.HLT), HLT1 comparator generates COMPH1 event.
|
||||||
|
//The COMPH1 event is connected to both CEVT1 and CEVT2.
|
||||||
|
//LLT1
|
||||||
|
//When comparator data < = (SDFLTxCMPL1.LLT), the LLT1 comparator generates COMPL1 event.
|
||||||
|
//The COMPL1 event is connected to both CEVT1 and CEVT2.
|
||||||
|
|
||||||
HLT = 0x7FFF; //Over value threshold settings
|
HLT = 0x7FFF; //Over value threshold settings
|
||||||
LLT = 0x0000; //Under value threshold settings
|
LLT = 0x0000; //Under value threshold settings
|
||||||
|
|
||||||
@ -304,8 +327,126 @@ void SdfmInit(void)
|
|||||||
Sdfm2Regs.SDDFPARM3.bit.FEN = 1;
|
Sdfm2Regs.SDDFPARM3.bit.FEN = 1;
|
||||||
Sdfm2Regs.SDDFPARM4.bit.FEN = 1;
|
Sdfm2Regs.SDDFPARM4.bit.FEN = 1;
|
||||||
EDIS;
|
EDIS;
|
||||||
|
|
||||||
|
Max = (BIT_MAX>>1)+IMAX_A_KZ*DIV_FACTOR_CURRENT_MOTOR/2/20;
|
||||||
|
Min = (BIT_MAX>>1)-IMAX_A_KZ*DIV_FACTOR_CURRENT_MOTOR/2/20;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sdfmInitPwmFlt(SDFM_IA, Min, Max);
|
||||||
|
sdfmInitPwmFlt(SDFM_IB, Min, Max);
|
||||||
|
sdfmInitPwmFlt(SDFM_IC, Min, Max);
|
||||||
|
|
||||||
|
sdfmInitPwmFlt(SDFM_U_DC, 0, 0x4200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CEVT_interrupt_enable 0;
|
||||||
|
|
||||||
|
void sdfmInitPwmFlt(uint16_t N, uint16_t LowFLT, uint16_t HightFlt)
|
||||||
|
{
|
||||||
|
EALLOW;
|
||||||
|
switch(N)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
Sdfm1Regs.SDCPARM1.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm1Regs.SDCPARM1.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm1Regs.SDCOMP1CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDCOMP1CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT1_FLG_CEVT1 = 1;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT1_FLG_CEVT2 = 1;
|
||||||
|
Sdfm1Regs.SDCPARM1.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDCPARM1.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDFLT1CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm1Regs.SDFLT1CMPL1.bit.LLT = LowFLT;
|
||||||
|
//Sdfm1Regs.SDIFLG.bit.FLT1_FLG_CEVT1;-flag
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
Sdfm1Regs.SDCPARM2.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm1Regs.SDCPARM2.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm1Regs.SDCOMP2CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDCOMP2CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT2_FLG_CEVT1 = 1;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT2_FLG_CEVT2 = 1;
|
||||||
|
Sdfm1Regs.SDCPARM2.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDCPARM2.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDFLT2CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm1Regs.SDFLT2CMPL1.bit.LLT = LowFLT;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Sdfm1Regs.SDCPARM3.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm1Regs.SDCPARM3.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm1Regs.SDCOMP3CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDCOMP3CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT3_FLG_CEVT1 = 1;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT3_FLG_CEVT2 = 1;
|
||||||
|
Sdfm1Regs.SDCPARM3.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDCPARM3.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDFLT3CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm1Regs.SDFLT3CMPL1.bit.LLT = LowFLT;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
Sdfm1Regs.SDCPARM4.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm1Regs.SDCPARM4.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm1Regs.SDCOMP4CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDCOMP4CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT4_FLG_CEVT1 = 1;
|
||||||
|
Sdfm1Regs.SDIFLGCLR.bit.FLT4_FLG_CEVT2 = 1;
|
||||||
|
Sdfm1Regs.SDCPARM4.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDCPARM4.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm1Regs.SDFLT4CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm1Regs.SDFLT4CMPL1.bit.LLT = LowFLT;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
Sdfm2Regs.SDCPARM1.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm2Regs.SDCPARM1.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm2Regs.SDCOMP1CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDCOMP1CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT1_FLG_CEVT1 = 1;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT1_FLG_CEVT2 = 1;
|
||||||
|
Sdfm2Regs.SDCPARM1.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDCPARM1.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDFLT1CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm2Regs.SDFLT1CMPL1.bit.LLT = LowFLT;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
Sdfm2Regs.SDCPARM2.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm2Regs.SDCPARM2.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm2Regs.SDCOMP2CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDCOMP2CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT2_FLG_CEVT1 = 1;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT2_FLG_CEVT2 = 1;
|
||||||
|
Sdfm2Regs.SDCPARM2.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDCPARM2.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDFLT2CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm2Regs.SDFLT2CMPL1.bit.LLT = LowFLT;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
Sdfm2Regs.SDCPARM3.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm2Regs.SDCPARM3.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm2Regs.SDCOMP3CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDCOMP3CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT3_FLG_CEVT1 = 1;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT3_FLG_CEVT2 = 1;
|
||||||
|
Sdfm2Regs.SDCPARM3.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDCPARM3.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDFLT3CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm2Regs.SDFLT3CMPL1.bit.LLT = LowFLT;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
Sdfm2Regs.SDCPARM4.bit.CEVT1SEL = 1;
|
||||||
|
Sdfm2Regs.SDCPARM4.bit.CEVT2SEL = 1;
|
||||||
|
Sdfm2Regs.SDCOMP4CTL.bit.CEVT1DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDCOMP4CTL.bit.CEVT2DIGFILTSEL = 0;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT4_FLG_CEVT1 = 1;
|
||||||
|
Sdfm2Regs.SDIFLGCLR.bit.FLT4_FLG_CEVT2 = 1;
|
||||||
|
Sdfm2Regs.SDCPARM4.bit.EN_CEVT1 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDCPARM4.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||||
|
Sdfm2Regs.SDFLT4CMPH1.bit.HLT = HightFlt;
|
||||||
|
Sdfm2Regs.SDFLT4CMPL1.bit.LLT = LowFLT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
EDIS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void sdfmGetResult(uint16_t N)
|
void sdfmGetResult(uint16_t N)
|
||||||
@ -313,11 +454,10 @@ void sdfmGetResult(uint16_t N)
|
|||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
int32_t OffsetCount = 0;
|
int32_t OffsetCount = 0;
|
||||||
|
|
||||||
// Gpio4out(1);
|
|
||||||
|
|
||||||
FilterResult[N][loopCounter[N]] = *SdfmReadData[N];
|
FilterResult[N][loopCounter[N]] = *SdfmReadData[N];
|
||||||
sdfmAdc[N] = FilterResult[N][loopCounter[N]] - sdfmOffset[N];
|
sdfmAdc[N] = FilterResult[N][loopCounter[N]] - sdfmOffset[N];
|
||||||
if(N != SDFM_U_DC) {
|
sdfmFiltr[N] = *SdfmReadFiltr[N];
|
||||||
|
if((N != SDFM_U_DC)&(N != SDFM_BRAKE)) {
|
||||||
if(loopCounter[N] < MAX_SAMPLES) loopCounter[N]++;
|
if(loopCounter[N] < MAX_SAMPLES) loopCounter[N]++;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -337,12 +477,6 @@ void sdfmGetResult(uint16_t N)
|
|||||||
SDDFPARM_Reg_arr[N]->bit.AE = 0;
|
SDDFPARM_Reg_arr[N]->bit.AE = 0;
|
||||||
EDIS;
|
EDIS;
|
||||||
sdfmAdcErr[N] = 0;
|
sdfmAdcErr[N] = 0;
|
||||||
|
|
||||||
// Gpio4out(0);
|
|
||||||
|
|
||||||
// if(N == SDFM_IA) Gpio54out(0);
|
|
||||||
// if(N == SDFM_IB) Gpio55out(0);
|
|
||||||
// if(N == SDFM_IC) Gpio56out(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -366,6 +500,13 @@ void sdfm_check_all_current_measurements_was_done(void)
|
|||||||
sdfmIndex &= ~SDFM_ALL_CURRENTS;
|
sdfmIndex &= ~SDFM_ALL_CURRENTS;
|
||||||
if(AllInitDone)
|
if(AllInitDone)
|
||||||
{
|
{
|
||||||
|
//ïåðåäàåì äàííûå â CLA
|
||||||
|
CurrentA =sdfmAdc[SDFM_IA];
|
||||||
|
CurrentB = sdfmAdc[SDFM_IB];
|
||||||
|
CurrentC = sdfmAdc[SDFM_IC];
|
||||||
|
currentCoefK = FACTOR_CURRENT_MOTOR;
|
||||||
|
currentCoefB=0;
|
||||||
|
Cla1ForceTask1();//Ïèíàåì ïåðâóþ çàäà÷ó CLA
|
||||||
vectorControl(sdfmAdc[SDFM_IA],sdfmAdc[SDFM_IB],sdfmAdc[SDFM_IC],sdfmAdc[SDFM_U_DC]);
|
vectorControl(sdfmAdc[SDFM_IA],sdfmAdc[SDFM_IB],sdfmAdc[SDFM_IC],sdfmAdc[SDFM_U_DC]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -383,6 +524,15 @@ void sdfm_check_brake_measurements_was_done(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t sdfmOverCurrentCounter = 0;
|
||||||
|
|
||||||
|
void sdfmOverCurrent(void)
|
||||||
|
{
|
||||||
|
// PWM_ABC_StopAllClose();
|
||||||
|
// vectorFault();
|
||||||
|
sdfmOverCurrentCounter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
__interrupt void Sdfm1_ISR(void)
|
__interrupt void Sdfm1_ISR(void)
|
||||||
{
|
{
|
||||||
@ -390,10 +540,18 @@ uint16_t i;
|
|||||||
uint32_t IntFlags;
|
uint32_t IntFlags;
|
||||||
|
|
||||||
IntFlags = Sdfm_readFlagRegister(SDFM1);
|
IntFlags = Sdfm_readFlagRegister(SDFM1);
|
||||||
|
//Òóò íóæíà ïðîâåðêà íà 8 ìëàäøèõ åñëè õîòü 1 â åäèíèöå òî ìû èç ïðåðûâàíèÿ êîìïîðàòîðà è äåëî äðÿíü.
|
||||||
|
if((IntFlags&0xF)>0){
|
||||||
|
//ïðåðûâàíèå îò êîìïîðàòîðà ïîäãîòîâêà ôëàãîâ îøèáêè.
|
||||||
|
iterputErrorSost=((IntFlags&0xF)<<1);
|
||||||
|
//Ñêîðåå âñåãî íóæíà ïðîâåðêà ÷òî ìû â STOP
|
||||||
|
return;
|
||||||
|
}
|
||||||
sdfmIndex |= (IntFlags & 0xF000)>>12;
|
sdfmIndex |= (IntFlags & 0xF000)>>12;
|
||||||
|
|
||||||
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x1000 << i)) sdfmGetResult(i);
|
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x1000 << i)) sdfmGetResult(i);
|
||||||
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x100 << i)) sdfmErr(i);
|
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x100 << i)) sdfmErr(i);
|
||||||
|
if( (((uint16_t)IntFlags)&0xFF) != 0 ) sdfmOverCurrent();
|
||||||
|
|
||||||
Sdfm_clearFlagRegister(SDFM1,IntFlags);
|
Sdfm_clearFlagRegister(SDFM1,IntFlags);
|
||||||
sdfm_check_all_current_measurements_was_done();
|
sdfm_check_all_current_measurements_was_done();
|
||||||
@ -408,6 +566,12 @@ uint16_t i;
|
|||||||
uint32_t IntFlags;
|
uint32_t IntFlags;
|
||||||
|
|
||||||
IntFlags = Sdfm_readFlagRegister(SDFM2);
|
IntFlags = Sdfm_readFlagRegister(SDFM2);
|
||||||
|
if((IntFlags&0xF)>0){
|
||||||
|
//ïðåðûâàíèå îò êîìïîðàòîðà ïîäãîòîâêà ôëàãîâ îøèáêè.
|
||||||
|
iterputErrorSost=((IntFlags&0xF)<<1)+1;
|
||||||
|
//Ñêîðåå âñåãî íóæíà ïðîâåðêà ÷òî ìû â STOP
|
||||||
|
return;
|
||||||
|
}
|
||||||
sdfmIndex |= (IntFlags & 0xF000)>>8;
|
sdfmIndex |= (IntFlags & 0xF000)>>8;
|
||||||
|
|
||||||
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x1000 << i)) sdfmGetResult(i+4);
|
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x1000 << i)) sdfmGetResult(i+4);
|
||||||
@ -449,13 +613,13 @@ void sdfm_start_conversion_brake(void)
|
|||||||
|
|
||||||
EDIS;
|
EDIS;
|
||||||
}
|
}
|
||||||
|
int16_t sdfm_get_erors(int16_t N)
|
||||||
|
{
|
||||||
|
return iterputErrorSost;
|
||||||
|
}
|
||||||
int16_t sdfm_get(int16_t N)
|
int16_t sdfm_get(int16_t N)
|
||||||
{
|
{
|
||||||
if( N>=0 && N<=7 )
|
|
||||||
return sdfmAdc[N];
|
return sdfmAdc[N];
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -60,12 +60,14 @@
|
|||||||
#define FACTOR_VDC (SDFM_VOLTAGE_MAX/R_VDC*(R_DEL_VDC+R_VDC)/1000) //= 320/806*(2000000+806)/1000
|
#define FACTOR_VDC (SDFM_VOLTAGE_MAX/R_VDC*(R_DEL_VDC+R_VDC)/1000) //= 320/806*(2000000+806)/1000
|
||||||
|
|
||||||
#define FACTOR_CURRENT_BRAKE_A (SDFM_VOLTAGE_MAX/R_BRAKE) //A
|
#define FACTOR_CURRENT_BRAKE_A (SDFM_VOLTAGE_MAX/R_BRAKE) //A
|
||||||
#define FACTOR_CURRENT_MOTOR_A (SDFM_VOLTAGE_MAX/R_DRW) //A
|
#define FACTOR_CURRENT_MOTOR_A (SDFM_VOLTAGE_MAX/R_DRW) //A //=320/4 = 80 A
|
||||||
|
|
||||||
#define FACTOR_CURRENT_BRAKE (FACTOR_CURRENT_BRAKE_A/BIT_MAX)
|
#define FACTOR_CURRENT_BRAKE (FACTOR_CURRENT_BRAKE_A/BIT_MAX)
|
||||||
#define FACTOR_CURRENT_MOTOR (FACTOR_CURRENT_MOTOR_A/BIT_MAX)
|
#define FACTOR_CURRENT_MOTOR (FACTOR_CURRENT_MOTOR_A/BIT_MAX) // 80/32768 = 0.00244
|
||||||
#define DIV_FACTOR_CURRENT_MOTOR (1/FACTOR_CURRENT_MOTOR)
|
#define DIV_FACTOR_CURRENT_MOTOR (1/FACTOR_CURRENT_MOTOR)
|
||||||
|
|
||||||
|
#define SDFM_FLT
|
||||||
|
|
||||||
void SdfmGpioInit(void);
|
void SdfmGpioInit(void);
|
||||||
void SdfmInitEnable(void);
|
void SdfmInitEnable(void);
|
||||||
void SdfmInitInterruptEn(void);
|
void SdfmInitInterruptEn(void);
|
||||||
@ -74,7 +76,7 @@ void sdfm_start_conversion_current(void);
|
|||||||
int16_t sdfm_get(int16_t N);
|
int16_t sdfm_get(int16_t N);
|
||||||
void SdfmTypeInit(void);
|
void SdfmTypeInit(void);
|
||||||
void sdfm_start_conversion_brake(void);
|
void sdfm_start_conversion_brake(void);
|
||||||
|
void sdfmInitPwmFlt(uint16_t N, uint16_t LowFLT, uint16_t HightFlt);
|
||||||
|
|
||||||
|
|
||||||
#endif /* SRC_SDFM_H_ */
|
#endif /* SRC_SDFM_H_ */
|
||||||
|
|||||||
@ -9,7 +9,8 @@
|
|||||||
#include "frm_uart.h"
|
#include "frm_uart.h"
|
||||||
|
|
||||||
#define LSPCLK_HZ 50000000.0
|
#define LSPCLK_HZ 50000000.0
|
||||||
#define BAUD 57600.0
|
//#define BAUD 57600.0
|
||||||
|
#define BAUD 4000000.0
|
||||||
#define BRR LSPCLK_HZ/(BAUD*8) + 1
|
#define BRR LSPCLK_HZ/(BAUD*8) + 1
|
||||||
|
|
||||||
uint16_t frmEn = 0;
|
uint16_t frmEn = 0;
|
||||||
|
|||||||
@ -26,18 +26,18 @@ void frmmstr_run(void)
|
|||||||
{
|
{
|
||||||
static uint16_t diod = 0;
|
static uint16_t diod = 0;
|
||||||
|
|
||||||
// if(SciaRegs.SCIRXST.bit.RXERROR)
|
if(SciaRegs.SCIRXST.bit.RXERROR)
|
||||||
// {
|
{
|
||||||
// EALLOW;
|
EALLOW;
|
||||||
// SciaRegs.SCICTL1.bit.SWRESET = 0;
|
SciaRegs.SCICTL1.bit.SWRESET = 0;
|
||||||
// EDIS;
|
EDIS;
|
||||||
// }
|
}
|
||||||
// else
|
else
|
||||||
// {
|
{
|
||||||
// EALLOW;
|
EALLOW;
|
||||||
// SciaRegs.SCICTL1.bit.SWRESET = 1;
|
SciaRegs.SCICTL1.bit.SWRESET = 1;
|
||||||
// EDIS;
|
EDIS;
|
||||||
// }
|
}
|
||||||
|
|
||||||
if(FMSTRIsEnable())
|
if(FMSTRIsEnable())
|
||||||
{
|
{
|
||||||
|
|||||||
@ -27,6 +27,7 @@
|
|||||||
#include "rele.h"
|
#include "rele.h"
|
||||||
#include "i2c_oled.h"
|
#include "i2c_oled.h"
|
||||||
#include "timersec.h"
|
#include "timersec.h"
|
||||||
|
#include "CLAinit.h"
|
||||||
|
|
||||||
extern uint16_t I2C_TXdata[];
|
extern uint16_t I2C_TXdata[];
|
||||||
extern uint16_t I2C_RXdata[];
|
extern uint16_t I2C_RXdata[];
|
||||||
@ -80,6 +81,7 @@ void InitPerif(void)
|
|||||||
PWMAllInit();
|
PWMAllInit();
|
||||||
|
|
||||||
PWMInitInterruptEn();
|
PWMInitInterruptEn();
|
||||||
|
PWMTripInit();
|
||||||
|
|
||||||
SpiCInit();
|
SpiCInit();
|
||||||
|
|
||||||
@ -111,11 +113,12 @@ void InitPerif(void)
|
|||||||
ERTM; // Enable Global realtime interrupt DBGM
|
ERTM; // Enable Global realtime interrupt DBGM
|
||||||
|
|
||||||
I2CMasterInit(I2C_OWN_ADDRESS,0x3C);
|
I2CMasterInit(I2C_OWN_ADDRESS,0x3C);
|
||||||
|
CLA_Init();
|
||||||
/* Init LCD */
|
/* Init LCD */
|
||||||
SSD1306_Init();
|
// SSD1306_Init();
|
||||||
buttonsInit();
|
// buttonsInit();
|
||||||
faultInit();
|
// faultInit();
|
||||||
rele_initRele();
|
// rele_initRele();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,8 +21,7 @@
|
|||||||
#include "temperature.h"
|
#include "temperature.h"
|
||||||
#include "rele.h"
|
#include "rele.h"
|
||||||
|
|
||||||
#define IMAX_A 35.0 //A
|
|
||||||
#define IMAX (IMAX_A*BIT_MAX/FACTOR_CURRENT_MOTOR_A)
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int16_t Value16in; //
|
int16_t Value16in; //
|
||||||
@ -84,6 +83,9 @@ float UdcVolt = 0;
|
|||||||
volatile float VdcFactor = FACTOR_VDC;
|
volatile float VdcFactor = FACTOR_VDC;
|
||||||
volatile uint16_t VoltProcImit = 0;
|
volatile uint16_t VoltProcImit = 0;
|
||||||
uint32_t Impuls = 0;
|
uint32_t Impuls = 0;
|
||||||
|
uint32_t ImpulsHi = 0;
|
||||||
|
uint32_t ImpulsLow = 0;
|
||||||
|
uint32_t ImpulsStep = 0;
|
||||||
int16_t AngleOffset = 0xc000, vectorAngle;
|
int16_t AngleOffset = 0xc000, vectorAngle;
|
||||||
|
|
||||||
|
|
||||||
@ -110,7 +112,7 @@ void vectorControl(int16_t CurrentA, int16_t CurrentB, int16_t CurrentC, int16_t
|
|||||||
Ia = -CurrentA;//sdfm_get(6);
|
Ia = -CurrentA;//sdfm_get(6);
|
||||||
Ib = -CurrentB;//sdfm_get(3);
|
Ib = -CurrentB;//sdfm_get(3);
|
||||||
Ic = -CurrentC;//sdfm_get(4);
|
Ic = -CurrentC;//sdfm_get(4);
|
||||||
if((Ia > IMAX)||(Ib>IMAX)||(Ic>IMAX)||(Ia<-IMAX)||(Ib<-IMAX)||(Ic<-IMAX) ) {OverCur[0] = Ia; OverCur[1] = Ib; OverCur[2] = Ic; ErrCur++; Mode = OffMode; CurFault++;}
|
if((Ia > IMAX_KZ)||(Ib>IMAX_KZ)||(Ic>IMAX_KZ)||(Ia<-IMAX_KZ)||(Ib<-IMAX_KZ)||(Ic<-IMAX_KZ) ) {OverCur[0] = Ia; OverCur[1] = Ib; OverCur[2] = Ic; ErrCur++; Mode = OffMode; CurFault++;}
|
||||||
|
|
||||||
|
|
||||||
UdcFiltered = Filter(sdfmUdc, &UdcFilter);
|
UdcFiltered = Filter(sdfmUdc, &UdcFilter);
|
||||||
@ -146,6 +148,14 @@ void vectorControl(int16_t CurrentA, int16_t CurrentB, int16_t CurrentC, int16_t
|
|||||||
}
|
}
|
||||||
else CurrLoop.piIq.Ref = CurrentRegTuneAmpl;
|
else CurrLoop.piIq.Ref = CurrentRegTuneAmpl;
|
||||||
break;
|
break;
|
||||||
|
case StepModeImpulses:
|
||||||
|
PWM_ABC_StartOut();
|
||||||
|
vectorSinCos.Angle = Step;
|
||||||
|
if(ImpulsStep <= ImpulsLow) CurrLoop.piIq.Ref = CurrentRegTuneAmpl;
|
||||||
|
else CurrLoop.piIq.Ref = CurrentRegTuneAmplInpuls;
|
||||||
|
if(ImpulsStep < (ImpulsLow + ImpulsHi)) ImpulsStep++;
|
||||||
|
else ImpulsStep = 0;
|
||||||
|
break;
|
||||||
case StayMode:
|
case StayMode:
|
||||||
PWM_ABC_StartOut();
|
PWM_ABC_StartOut();
|
||||||
CurrLoop.piIq.Ref = CurrentRegTuneAmpl;
|
CurrLoop.piIq.Ref = CurrentRegTuneAmpl;
|
||||||
@ -383,10 +393,10 @@ void vector_klark_park(uint16_t SectorOn, int16_t CurrentA, int16_t CurrentB, in
|
|||||||
( CurrLoop.piIq.Ref = -CurrLoop.CurrentLimit);
|
( CurrLoop.piIq.Ref = -CurrLoop.CurrentLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrLoop.piIq.Fbk = vectorIdq.q;
|
CurrLoop.piIq.Fbk = vectorIdq.q;// действующий ток
|
||||||
|
|
||||||
// CurrLoop.piId.Ref = 0;
|
// CurrLoop.piId.Ref = 0;
|
||||||
CurrLoop.piId.Fbk = vectorIdq.d;
|
CurrLoop.piId.Fbk = vectorIdq.d;//
|
||||||
|
|
||||||
// CurrLoop.piId.Umax = CurrLoop.piIq.Umax = Inputs->Udc;
|
// CurrLoop.piId.Umax = CurrLoop.piIq.Umax = Inputs->Udc;
|
||||||
// CurrLoop.piId.Umin = CurrLoop.piIq.Umin = -CurrLoop.piIq.Umax;
|
// CurrLoop.piId.Umin = CurrLoop.piIq.Umin = -CurrLoop.piIq.Umax;
|
||||||
|
|||||||
@ -37,9 +37,13 @@
|
|||||||
#define VOLT_MAX_FACTOR VOLT_MAX_PROC/100.0
|
#define VOLT_MAX_FACTOR VOLT_MAX_PROC/100.0
|
||||||
#define PI_REG_I_PROPOR 14.0 // 30
|
#define PI_REG_I_PROPOR 14.0 // 30
|
||||||
#define PI_REG_I_INTEGR 0.14 // 0.04
|
#define PI_REG_I_INTEGR 0.14 // 0.04
|
||||||
#define CURRENT_MAX 40.0 //A
|
#define CURRENT_MAX 45.0 //A
|
||||||
#define ZERO_LVL 0.00001f
|
#define ZERO_LVL 0.00001f
|
||||||
|
|
||||||
|
|
||||||
|
#define IMAX_A_KZ 70.0 //A
|
||||||
|
#define IMAX_KZ (IMAX_A_KZ*BIT_MAX/FACTOR_CURRENT_MOTOR_A)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float q;
|
float q;
|
||||||
@ -76,8 +80,9 @@ typedef struct
|
|||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
OffMode, //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
OffMode,
|
||||||
StepMode, //
|
StepMode,
|
||||||
|
StepModeImpulses,
|
||||||
StayMode,
|
StayMode,
|
||||||
CurrentRegTune,
|
CurrentRegTune,
|
||||||
TestPWNMode,
|
TestPWNMode,
|
||||||
|
|||||||
@ -31,10 +31,12 @@ Rele.Error - появляется если после включение рел
|
|||||||
Mode - режим работы.
|
Mode - режим работы.
|
||||||
0 - стоим, всё выключено,
|
0 - стоим, всё выключено,
|
||||||
1 - шаговый режим (задать ток CurrentRegTuneAmpl для шагового режима, скорость меняется через Nstep)
|
1 - шаговый режим (задать ток CurrentRegTuneAmpl для шагового режима, скорость меняется через Nstep)
|
||||||
2 - режим поворота на заданный угол (задать ток CurrentRegTuneAmpl для шагового режима, угол поворота через vectorSinCos.angle)
|
2 - шаговый импульсный режим
|
||||||
3 - режим настройки регулятора тока
|
3 - режим поворота на заданный угол (задать ток CurrentRegTuneAmpl для шагового режима, угол поворота через vectorSinCos.angle)
|
||||||
4 - шим по одному транзистору (панель TestPWM, см ниже)
|
4 - режим настройки регулятора тока
|
||||||
6 - вращение по датчику с контуром тока (задать ток CurrentRegTuneAmpl)
|
5 - шим по одному транзистору (панель TestPWM, см ниже)
|
||||||
|
6 - зарезервировано (переключится в 0)
|
||||||
|
7 - вращение по датчику с контуром тока (задать ток CurrentRegTuneAmpl)
|
||||||
|
|
||||||
|
|
||||||
CurrentRegTuneAmpl - заданный ток для формирования поля когда включен контур тока
|
CurrentRegTuneAmpl - заданный ток для формирования поля когда включен контур тока
|
||||||
@ -46,6 +48,9 @@ NoLoop - отключение контура тока (возможность з
|
|||||||
vectorUdq.q - поперечная составляющая напряжения, при включенном регуляторе тока формируется регулятором, при отключенном можно задавать вручную
|
vectorUdq.q - поперечная составляющая напряжения, при включенном регуляторе тока формируется регулятором, при отключенном можно задавать вручную
|
||||||
|
|
||||||
vectorUdq.d - продольная составляющая напряжения, при включенном регуляторе тока формируется регулятором, при отключенном можно задавать вручную
|
vectorUdq.d - продольная составляющая напряжения, при включенном регуляторе тока формируется регулятором, при отключенном можно задавать вручную
|
||||||
|
___________________________________________
|
||||||
|
|
||||||
|
В шаговом режиме можно задать одиночный импульс с шагом 0.0001 с.
|
||||||
|
|
||||||
Impuls - время импульса тока в секундах (когда значение не равно нулю работает обратный отсчёт и ток = CurrentRegTuneAmplInpuls, когда равно нулю значение тока = CurrentRegTuneAmpl)
|
Impuls - время импульса тока в секундах (когда значение не равно нулю работает обратный отсчёт и ток = CurrentRegTuneAmplInpuls, когда равно нулю значение тока = CurrentRegTuneAmpl)
|
||||||
|
|
||||||
@ -54,6 +59,14 @@ CurrentRegTuneAmplInpuls - величина импульса тока в амп
|
|||||||
AngleOffset - смещение датчика ротора относительно обмоток статора.
|
AngleOffset - смещение датчика ротора относительно обмоток статора.
|
||||||
___________________________________________
|
___________________________________________
|
||||||
|
|
||||||
|
Шаговый импульсный режим.
|
||||||
|
|
||||||
|
ток задаётся импульсами:
|
||||||
|
в течение времени ImpulsLow ток имеет значение CurrentRegTuneAmpl
|
||||||
|
в течение времени ImpulsHi ток имеет значение CurrentRegTuneAmplInpuls
|
||||||
|
время кратно 0.0001 с
|
||||||
|
___________________________________________
|
||||||
|
|
||||||
в левом окне блок TestPWM - в этом режиме можно включить ШИМ на любой транзистор.
|
в левом окне блок TestPWM - в этом режиме можно включить ШИМ на любой транзистор.
|
||||||
Для этого нужно включить реле, выбрать Mode = 4.
|
Для этого нужно включить реле, выбрать Mode = 4.
|
||||||
После этого переменная Num обозначает -- какие из транзисторов включены.
|
После этого переменная Num обозначает -- какие из транзисторов включены.
|
||||||
@ -77,4 +90,10 @@ ___________________________________________
|
|||||||
слева выбрать график I с биноклем который
|
слева выбрать график I с биноклем который
|
||||||
после этого менять CurrLoop.piId.Kp и CurrLoop.piId.Ki чтобы изменить характеристику
|
после этого менять CurrLoop.piId.Kp и CurrLoop.piId.Ki чтобы изменить характеристику
|
||||||
|
|
||||||
|
___________________________________________
|
||||||
|
Измененние частоты ШИМ проводить при Mode = 0.
|
||||||
|
В других режимах частота меняться не будет.
|
||||||
|
|
||||||
|
Задаётся период в мкС от 50 до 125
|
||||||
|
В переменной PeriodPWM (слева выбрать вкладку timing)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user