dev(UML-2579): В тестовое окружение sdfm добавлен CLA модуль. Даннный код имеет ознакомительный характер т.к программа озврпщает указатель на нулевой адресс при первомже прерывании.

This commit is contained in:
sedov 2024-09-05 16:33:09 +03:00
parent 9077ce62ff
commit 6a297b55eb
37 changed files with 977 additions and 586 deletions

32
README.md Normal file
View 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".

View File

@ -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={&quot;c2000ware_software_package&quot;:[&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_INCLUDE_PATH}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARY_PATH}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARIES}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYMBOLS}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYSCONFIG_MANIFEST}&quot;]}"/> <listOptionValue builtIn="false" value="PRODUCT_MACRO_IMPORTS={&quot;c2000ware_software_package&quot;:[&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_INCLUDE_PATH}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARY_PATH}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_LIBRARIES}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYMBOLS}&quot;,&quot;${COM_TI_C2000WARE_SOFTWARE_PACKAGE_SYSCONFIG_MANIFEST}&quot;]}"/>
</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

View File

@ -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,

View File

@ -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
// //

View File

@ -73,6 +73,8 @@ void GpioSetOrange(void)
void GpioInit(void) void GpioInit(void)
{ {
EALLOW; EALLOW;

View File

@ -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);

View File

@ -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;

View File

@ -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);

View 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;
}

View 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_ */

View File

@ -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();

View File

@ -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

View File

@ -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.

View File

@ -23,6 +23,7 @@
void main(void) void main(void)
{ {
InitPerif(); InitPerif();
for(;;) for(;;)

View File

@ -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; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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
// //

View File

@ -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_ */

View File

@ -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, &currentIa);
convertCurrentToAmps(CurrentB, currentCoefB, currentCoefK, &currentIb);
convertCurrentToAmps(CurrentC, currentCoefB, currentCoefK, &currentIc);
// // Ďîäń÷ĺň îńíîâíűő ďŕđŕěĺňđîâ
//Post processing calculateMainParameters(currentIa, currentIb, currentIc, &currentAlpha, &currentBeta, &currentOffset);
//
if(fVal < 0)
{
result = - result;
}
int ii=GpioDataRegs.GPADAT.bit.GPIO31;
fResult = ii; // Ďîäń÷ĺň ńňŕňčńňč÷ĺńęčő ďŕđŕěĺňđîâ
calculateStatisticalParameters(currentAlpha, currentBeta, &currentRms, &currentLength, &currentSqrlen);
// Äîáŕâëĺíčĺ äŕííűő â ńďčńîę
addToList(currentLength * currentLength);
currentIa=55;
currentIb=66;
currentIc=77;
} }
interrupt void Cla1Task2 ( void ) interrupt void Cla1Task2 ( void )

View File

@ -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

View File

@ -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)
{ {

View File

@ -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);

View File

@ -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;

View File

@ -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;
} }

View File

@ -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_ */

View File

@ -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;

View File

@ -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())
{ {

View File

@ -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();
} }

View File

@ -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;

View File

@ -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,

View File

@ -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)