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="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
<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;]}"/>
</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"/>
@ -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.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">
<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}/src/CLB}"/>
<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
{
@ -64,11 +61,6 @@ MEMORY
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
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
@ -114,63 +106,6 @@ SECTIONS
Filter4_RegsFile : > RAMGS4, fill=0x4444
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__)
.TI.ramfunc : {} LOAD = FLASH3,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,

View File

@ -19,23 +19,10 @@
#include "frmmstr_run.h"
#include "adc_init.h"
#include "biss.h"
#include "CLAinit.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
InitPerif();
// Определение глобальной константы
#pragma DATA_SECTION(glob_buff, "CLADataLS0") // Поместим константу в память, доступную CLA
Uint16 glob_buff = 0x555;
// Инициализация CLA
CLA_configClaMemory();
CLA_initCpu1Cla1();
Cla1ForceTask1(); // Выполнить задачу 1 один раз для инициализации
CLA_runTest();
for(;;)
{
@ -43,7 +30,6 @@ void main(void)
}
//
// End of file
//

View File

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

View File

@ -1,7 +1,7 @@
/*
* pwm_init.h
*
* Created on: 21 ŕâă. 2023 ă.
* Created on: 21 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: seklyuts
*/
#include "f28x_project.h"
@ -14,28 +14,51 @@
#define FREQUENCY_BRAKE 200000.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_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 SDFM_DELAY_mkS 50.0 //mkS
#define SDFM_DELAY (SDFM_DELAY_mkS*SYS_PWM_FREQUENCY/1000000)
#define PERIOD_2 (PERIOD_MOTOR/2.0)
#define PWM_MAX (PERIOD_MOTOR - EPWM_DB)
#define PWM_MIN EPWM_DB*2
#define PERIOD_DIV2 (PERIOD_MOTOR/2.0)
#define PERIOD_MAX (PERIOD_MOTOR*1.25)
//#define PWM_MAX (PERIOD_MOTOR - EPWM_DB)
//#define PWM_MIN EPWM_DB*2
#define INDEPENDED 1
#define COMPLIMENTARY 0
#ifdef REF0
#define PWM_A 5
#define PWM_B 2
#define PWM_C 7
#define PWM_FAN 3
#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 PWMGpioInit(void);
void PWMInitEnable(void);
@ -43,7 +66,7 @@ void PWMInitInterruptEn(void);
void PWMAllInit(void);
void PWM_ABC_StopAllClose(void);
void PWM_ABC_StartOut(void);
void PWM_ABC_Start(uint16_t Num);
void InitEPwm1Example(void);
void InitEPwm2Example(void);

View File

@ -35,7 +35,7 @@ typedef struct
int16_t UC;
}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;
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)
{
A_proc = (int16_t)((phaseA/Udc)*PERIOD_2);
B_proc = (int16_t)((phaseB/Udc)*PERIOD_2);
C_proc = (int16_t)((phaseC/Udc)*PERIOD_2);
A_proc = (int16_t)((phaseA/Udc)*PERIOD_DIV2);
B_proc = (int16_t)((phaseB/Udc)*PERIOD_DIV2);
C_proc = (int16_t)((phaseC/Udc)*PERIOD_DIV2);
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;
else if(C_proc < 0) C_proc-= EPWM_DB/2;
PWM_motor.UA = PERIOD_2 + A_proc;
PWM_motor.UB = PERIOD_2 + B_proc;
PWM_motor.UC = PERIOD_2 - C_proc;
PWM_motor.UA = PERIOD_DIV2 + A_proc;
PWM_motor.UB = PERIOD_DIV2 + B_proc;
PWM_motor.UC = PERIOD_DIV2 - C_proc;
FaultABC = 0;//(FaultPWM);
if(FaultABC) FaultABCFix = FaultABC;
@ -65,9 +65,9 @@ void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC, float Udc)
if((FaultABC)||(FaultABCFix))
{
PWM_ABC_StopAllClose();
PWM_motor.UA = PERIOD_2;
PWM_motor.UB = PERIOD_2;
PWM_motor.UC = PERIOD_2;
PWM_motor.UA = PERIOD_DIV2;
PWM_motor.UB = PERIOD_DIV2;
PWM_motor.UC = PERIOD_DIV2;
vectorFault();
}
@ -132,9 +132,9 @@ __interrupt void epwm2_isr(void)
AdcStartSet();
BissStartSet();
PWM_ABC_StopAllClose();
PWM_motor.UA = PERIOD_2;
PWM_motor.UB = PERIOD_2;
PWM_motor.UC = PERIOD_2;
PWM_motor.UA = PERIOD_DIV2;
PWM_motor.UB = PERIOD_DIV2;
PWM_motor.UC = PERIOD_DIV2;
vectorFault();
EPwmRegs[3]->CMPA.bit.CMPA = PERIOD_MOTOR - PWM_Vent;
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_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_SetupPinMux(58,GPIO_MUX_CPU2,7); //SDFM-2 Channel 2 Data Input (Udc)
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 "spi_init.h"
#include "biss.h"
#include "sdfm_pwm_xbar.h"
#define TO_CPU1 0
@ -117,6 +118,7 @@ void InitPerif(void)
BissGpioInit();
BissInit();
sdfm_pwm_xbarInit();
// ConfigureADC();

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configurations XML_version="1.2" id="configurations_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"/>
<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
{
@ -61,6 +64,11 @@ MEMORY
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
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
@ -100,7 +108,7 @@ SECTIONS
/* The following section definition are for SDFM examples */
// Filter_RegsFile : > RAMGS10
Filter1_RegsFile : > RAMLS1
Filter1_RegsFile : > RAMGS5
Filter2_RegsFile : > RAMLS2
Filter3_RegsFile : > RAMLS3
Filter4_RegsFile : > RAMLS4
@ -114,6 +122,66 @@ SECTIONS
// Filter14_RegsFile : > RAMGS14
// 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__)
.TI.ramfunc : {} LOAD = FLASH3,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,

Binary file not shown.

View File

@ -23,6 +23,7 @@
void main(void)
{
InitPerif();
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) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
{
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_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè

View File

@ -1,7 +1,7 @@
/*
* GD25Q16ETIGR.c
*
* Created on: 7 ñåíò. 2023 ã.
* Created on: 7 сент. 2023 г.
* Author: seklyuts
*/
#include "f28x_project.h"
@ -29,15 +29,27 @@ uint16_t GD25Q16ETIGR_buffer8bytes[8];
uint16_t SectorWasErraised[512];
uint16_t writeVerify = 1;
uint16_t GD25Q16ETIGR_Sektor_Addr(uint32_t Addr)
void delay(void)
{
uint16_t sektor;
for (sektor=1; sektor <= 512; sektor++ )
uint32_t i;
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)
{
volatile uint16_t empty;
// GD25Q16ETIGR_checkRXFFST();
transmitData(WriteEnable);
while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
{
@ -65,6 +78,7 @@ void GD25Q16ETIGR_en(void)
uint16_t GD25Q16ETIGR_ReadStatus(void)
{
volatile uint16_t empty;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadStatusRegister1);
transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
@ -76,18 +90,37 @@ uint16_t GD25Q16ETIGR_ReadStatus(void)
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;
Stat = GD25Q16ETIGR_ReadStatus();
while((Stat&0x1) != 0 )
{
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_checkRXFFST();
transmitData(SectorErase);
transmitData(Addr>>16);
transmitData(Addr>>8);
@ -100,18 +133,19 @@ void GD25Q16ETIGR_sector_erase(uint32_t Addr)
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;
uint16_t Stat = 1;
Stat = GD25Q16ETIGR_ReadStatus();
while((Stat&0x1) != 0 )
{
Stat = GD25Q16ETIGR_ReadStatus();
}
uint16_t Err = 0;
Err = GD25Q16ETIGR_WaitStatus();
if(Err) return Err;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadData);
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;
}
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;
uint16_t Stat = 1;
Stat = GD25Q16ETIGR_ReadStatus();
while((Stat&0x1) != 0 )
{
Stat = GD25Q16ETIGR_ReadStatus();
}
uint16_t Err = 0;
Err = GD25Q16ETIGR_WaitStatus();
if(Err) return Err;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadData);
transmitData(Addr>>16);
@ -158,23 +193,33 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint
empty = SpiRegs.SPIRXBUF;
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;
uint16_t Stat = 1;
Stat = GD25Q16ETIGR_ReadStatus();
while((Stat&0x1) != 0 )
{
Stat = GD25Q16ETIGR_ReadStatus();
}
uint16_t Err = 0;
GD25Q16ETIGR_en();
Err = GD25Q16ETIGR_WaitStatus();
if(Err) return Err;
GD25Q16ETIGR_en();
// GD25Q16ETIGR_checkRXFFST();
transmitData(PageProgram);
transmitData(Addr>>16);
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;
}
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;
uint16_t addr_read_data[8];
uint16_t Err = 0;
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
{//в этом цикле только полные посылки по 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);
read_data+=4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//åñëè áàéò íå÷¸òíîå ÷èñëî, òî äîïîëíÿåì äî ÷¸òíîãî íóë¸ì
{//тут м.б. от 1 до 8 байт
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
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);
}
return 0;
}
@ -226,14 +326,14 @@ uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * ver
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
{//в этом цикле только полные посылки по 8 байт
copy16_to_8(verify_data, addr_vfy_data, 4);
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
verify_data+=4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
{//тут м.б. от 1 до 8 байт
quant16 = quant16bitWords(quant8-i);
copy16_to_8(verify_data, addr_vfy_data, quant16);
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;
}
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;
uint16_t addr_write_data[8];
uint16_t quant16;
uint16_t Err = 0;
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
{ //в этом цикле только полные посылки по 8 байт
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;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
{//тут м.б. от 1 до 8 байт
quant16 = quant16bitWords(quant8-i);
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 page_quant_8bit = 0;
uint16_t FlashSektorStart = 0;
uint16_t FlashSektorEnd = 0;
uint16_t i=0;
uint16_t Err = 0;
FlashSektorStart = GD25Q16ETIGR_Sektor_Addr(Addr_8bit); //ñåêòîð ñ êîòîðîãî íà÷èíàåòñÿ çàïèñü
FlashSektorEnd = GD25Q16ETIGR_Sektor_Addr(Addr_8bit + quant_8bit - 1); //ñåêòîð â êîòîðîì êîíåö çàïèñè
FlashSektorStart = (Addr_8bit)>>12; //сектор с которого начинается запись
FlashSektorEnd = (Addr_8bit + quant_8bit - 1)>>12; //сектор в котором конец записи
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); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå (îíè ó íàñ 16-áèòíûìè ñëîâàìè)
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //вычисляем кол-во байт данных до конца текущей страницы
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit, addr_write_data); //записываем эти данные на текущую страницу
if(Err) return Err;
Addr_8bit += page_quant_8bit; //перелистываем страницу внешней памяти
addr_write_data += page_quant_8bit/2; //шагаем на следующие незаписанные данные в буфере (они у нас 16-битными словами)
quant_8bit -= page_quant_8bit; //уменьшаем кол-во данных на величину которую уже записали
}
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)
{
volatile uint16_t empty, i, j;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadManufacturerDeviceID);
for(i = 0; i<5; i++) transmitData(0xFF);

View File

@ -13,8 +13,8 @@
void GD25Q16ETIGR_en(void);
void GD25Q16ETIGR_write(void);
void 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_write_data(uint32_t Addr, uint16_t quant, uint16_t * write_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_ReadManufacturerDeviceID(void);
void GD25Q16ETIGR_clean_SectorWasErraised(void);

View File

@ -1,7 +1,7 @@
/*
* ZD24C02A.c
*
* Created on: 8 сент. 2023 г.
* Created on: 8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: seklyuts
*/
#include "f28x_project.h"
@ -9,12 +9,12 @@
#include "ZD24C02A.h"
#include "Arr.h"
//Нуждается в проверке и отладке, так как с этой микросхемой не удалось добиться стабильной работы, она то работает, то нет
volatile uint16_t SlaveAdr = I2C_SLAVE_ADDRESS;
volatile uint16_t SlaveAdr = I2C_SLAVE_ADDRESS1;
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;
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)
{
uint32_t i=0;
uint16_t addr_write_data[8];
uint16_t addr_write_data[0x100];
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)
{//в этом цикле только полные посылки по 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);
if( ZD24C02A_write_8(Addr+i, addr_write_data, 8)) return 1;
write_data += 4;
}
}
if(i < quant8)
{//тут м.б. от 1 до 8 байт
{//<EFBFBD><EFBFBD><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
quant16 = quant16bitWords(quant8-i);
copy16_to_8(write_data, addr_write_data, quant16);
if( ZD24C02A_write_8(Addr+i, addr_write_data, (quant8 - i))) return 1;
}
*/
return 0;
}
@ -70,16 +79,16 @@ uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
if(quant8 > 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;
copy8_to_16(addr_read_data, read_data, 4);
read_data+=4;
}
}
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((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);
}
return 0;
@ -95,7 +104,7 @@ uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant8, uint16_t * verify_data)
if(quant8 > 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);
Err_read = ZD24C02A_verify_8(Addr+i, addr_vfy_data, 8);
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)
{//тут м.б. от 1 до 8 байт
{//<EFBFBD><EFBFBD><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
quant16 = quant16bitWords(quant8-i);
copy16_to_8(verify_data, addr_vfy_data, quant16);
Err_read = ZD24C02A_verify_8(Addr+i, addr_vfy_data, (quant8 - i));
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)
{
I2CRead(SlaveAdr, byteCount, true, Array);

View File

@ -1,14 +1,16 @@
/*
* ZD24C02A.h
*
* Created on: 8 ñåíò. 2023 ã.
* Created on: 8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: seklyuts
*/
#ifndef 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 ZD24C02A_SIZE 0x80

View File

@ -8,165 +8,58 @@
#ifndef CLAINIT_C_
#define CLAINIT_C_
#include "f2838x_device.h"
#include "cla_shared.h"
#include "f2838x_examples.h"
#include "config.h"
#include "f28x_project.h"
#include "CLAinit.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
//The Exponential table
//
#ifdef __cplusplus
#pragma DATA_SECTION("CLADataLS0")
#else
#pragma DATA_SECTION(CLAasinTable,"CLADataLS0")
#endif //__cplusplus
float CLAasinTable[]={
0.0, 1.0, 0.0,
0.000000636202, 0.999877862610, 0.007815361896,
0.000005099694, 0.999510644409, 0.015647916155,
0.000017268312, 0.998895919094, 0.023514960332,
0.000041121765, 0.998029615282, 0.031434003631,
0.000080794520, 0.996905974725, 0.039422875916,
0.000140631089, 0.995517492804, 0.047499840611,
0.000225244584, 0.993854840311, 0.055683712914,
0.000339579512, 0.991906765146, 0.063993984848,
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
};
// MAX_SIZE=50
// Ïåðåìåííûå, êîòîðûå áóäóò ïåðåäàíû îò CPU ê CLA
#pragma DATA_SECTION(CurrentA, "CpuToCla1MsgRAM");
float CurrentA; // Òîê â ôàçå A
#pragma DATA_SECTION(CurrentB, "CpuToCla1MsgRAM");
float CurrentB; // Òîê â ôàçå B
#pragma DATA_SECTION(CurrentC, "CpuToCla1MsgRAM");
float CurrentC; // Òîê â ôàçå C
#pragma DATA_SECTION(currentCoefK, "CpuToCla1MsgRAM");
float currentCoefK; // Êîýôôèöèåíò ïðåîáðàçîâàíèÿ
#pragma DATA_SECTION(currentCoefB, "CpuToCla1MsgRAM");
float currentCoefB; // Êîýôôèöèåíò ñäâèãà
#pragma DATA_SECTION(dataList, "Cla1ToCpuMsgRAM");
float dataList[MAX_SIZE]; // Êîýôôèöèåíò ñäâèãà
#pragma DATA_SECTION(dataSize, "Cla1ToCpuMsgRAM");
int dataSize; // Êîýôôèöèåíò ñäâèãà
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,
1.004232, 0.9757544, 0.9484279, 0.9221048, 0.8966658,
0.8720123, 0.8480621, 0.8247454, 0.8020028, 0.7797828,
0.7580408, 0.7367374, 0.7158381, 0.6953120, 0.6751316,
0.6552721, 0.6357113, 0.6164289, 0.5974064, 0.5786270,
0.5600753, 0.5417370, 0.5235988, 0.5056486, 0.4878751,
0.4702678, 0.4528166, 0.4355124, 0.4183464, 0.4013104,
0.3843968, 0.3675981, 0.3509074, 0.3343180, 0.3178237,
0.3014185, 0.2850964, 0.2688521, 0.2526802, 0.2365756,
0.2205333, 0.2045484, 0.1886164, 0.1727327, 0.1568929,
0.1410927, 0.1253278, 0.1095943, 0.09388787, 0.07820469,
0.06254076, 0.04689218, 0.03125509, 0.01562564
};
//extern static SimpleList list;
// Ïåðåìåííûå, êîòîðûå áóäóò ïåðåäàíû îò CLA ê CPU
#pragma DATA_SECTION(currentIa, "Cla1ToCpuMsgRAM");
volatile float currentIa; // Òîê â ôàçå A
#pragma DATA_SECTION(currentIb, "Cla1ToCpuMsgRAM");
volatile float currentIb; // Òîê â ôàçå B
#pragma DATA_SECTION(currentIc, "Cla1ToCpuMsgRAM");
volatile float currentIc; // Òîê â ôàçå C
#pragma DATA_SECTION(currentAlpha, "Cla1ToCpuMsgRAM");
volatile float currentAlpha; // Òîê â îñè àëüôà
#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 fail=0;
void CLA_Init(){
CLA_configClaMemory();
CLA_initCpu1Cla1();
}
//
// CLA_runTest - Execute CLA task tests for specified vectors
@ -174,25 +67,20 @@ uint16_t fail=0;
void CLA_runTest(void)
{
int16_t i;
float error;
float error;
int pass = 0, fail = 0;
for(i=0; i < BUFFER_SIZE; i++)
{
fVal= (float)(BUFFER_SIZE - i)/(float)BUFFER_SIZE;
Cla1ForceTask1andWait();
for (i = 0; i < BUFFER_SIZE; i++) {
// Ïåðåäàåì âõîäíûå çíà÷åíèÿ îò CPU ê CLA
CurrentA =1;
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
@ -254,19 +142,19 @@ void CLA_configClaMemory(void)
// First configure the CLA to be the master for LS5 and then
// set the space to be a program block
//
MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS7 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS7 = 1;
//
// Next configure LS0RAM and LS1RAM as data spaces for the CLA
// First configure the CLA to be the master for LS0(1) and then
// set the spaces to be code blocks
//
MemCfgRegs.LSxMSEL.bit.MSEL_LS6 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS6 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS7 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS7 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
EDIS;
}
@ -283,7 +171,7 @@ __interrupt void cla1Isr1 ()
//
// 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_8_INT = &cla1Isr8;
/// Enable CLA Task1 to SDFM1 Iterput
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1 = 95U;
//
// Enable CLA interrupts at the group and subgroup levels
//

View File

@ -8,6 +8,35 @@
#ifndef 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_ */

View File

@ -1,43 +1,10 @@
//#############################################################################
// \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
@ -45,6 +12,7 @@
#include "cla_shared.h"
#include "f28x_project.h"
#include "config.h"
//
// Defines
//
@ -52,77 +20,121 @@
//
// 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
//
//Task 1 : Calculate asin(X)
// Description:
// Step(1): Calculate absolute of the input X
//
// Step(2): Use the upper 6-bits of input "X" value as an
// index into the table to obtain the coefficients
// for a second order equation:
//
// _FPUasinTable:
// CoeffA0[0]
// CoeffA1[0]
// CoeffA2[0]
// .
// .
// CoeffA0[63]
// CoeffA1[63]
// CoeffA2[63]
//
// Step(3): Calculate the angle using the following equation:
//
// arctan(Ratio) = A0 + A1*Ratio + A2*Ratio*Ratio
// arctan(Ratio) = A0 + Ratio(A1 + A2*Ratio)
//
// Step(4): The final angle is determined as follows:
//
// if( X < 0 )
// Angle = -Angle
#define MAX_SIZE 50 // Ěŕęńčěŕëüíűé đŕçěĺđ ńďčńęŕ
#define SDFM_VOLTAGE_MAX 320.0 //mV
#define R_BRAKE 220.0 //mOM
#define R_DRW 4.0 //mOM
#define R_VDC 806.0 //Om
#define R_DEL_VDC 2000000.0 //Om
#define BIT_MAX 32768//4096
#define IMAX_A 25.0 //A
#define IMAX (IMAX_A*BIT_MAX/FACTOR_CURRENT_MOTOR_A)
#define FACTOR_VDC (SDFM_VOLTAGE_MAX/R_VDC*(R_DEL_VDC+R_VDC)/1000)
#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_BRAKE (FACTOR_CURRENT_BRAKE_A/BIT_MAX)
#define FACTOR_CURRENT_MOTOR (FACTOR_CURRENT_MOTOR_A/BIT_MAX)
float mySqrt(float number) {
if (number < 0) {
// Âîçâđŕůŕĺě NaN äë˙ îňđčöŕňĺëüíűő ÷čńĺë
return -1.0f; // Čëč ěîćíî čńďîëüçîâŕňü ńďĺöčŕëüíîĺ çíŕ÷ĺíčĺ äë˙ îáîçíŕ÷ĺíč˙ îřčáęč
}
if (number == 0) {
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 )
{
//
//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;
// Äë˙ đŕáîňű ôóíęöčč íóćíî ďĺđĺäŕňü âíĺříčĺ äŕíííűĺ â CLA
result = A0 + fVal*(A1 + A2*fVal);
// Ďđĺîáđŕçîâŕíčĺ ňîęîâ
convertCurrentToAmps(CurrentA, currentCoefB, currentCoefK, &currentIa);
convertCurrentToAmps(CurrentB, currentCoefB, currentCoefK, &currentIb);
convertCurrentToAmps(CurrentC, currentCoefB, currentCoefK, &currentIc);
//
//Post processing
//
if(fVal < 0)
{
result = - result;
}
int ii=GpioDataRegs.GPADAT.bit.GPIO31;
// Ďîäń÷ĺň îńíîâíűő ďŕđŕěĺňđîâ
calculateMainParameters(currentIa, currentIb, currentIc, &currentAlpha, &currentBeta, &currentOffset);
fResult = ii;
// Ďîäń÷ĺň ńňŕňčńňč÷ĺńęčő ďŕđŕěĺňđîâ
calculateStatisticalParameters(currentAlpha, currentBeta, &currentRms, &currentLength, &currentSqrlen);
// Äîáŕâëĺíčĺ äŕííűő â ńďčńîę
addToList(currentLength * currentLength);
currentIa=55;
currentIb=66;
currentIc=77;
}
interrupt void Cla1Task2 ( void )

View File

@ -6,42 +6,6 @@
//
// 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
//
@ -62,16 +26,33 @@ extern "C" {
#define PI 3.141592653589
#define INV2PI 0.159154943
//
// Globals
//
//
//Task 1 (C) Variables
//
extern float y[]; //Result vector
extern float fVal; //Holds the input argument to the task
extern float fResult; //The arsine of the input argument
#define MAX_SIZE 50
extern float dataList[MAX_SIZE];
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

View File

@ -31,27 +31,28 @@ volatile uint16_t TimerBase = PERIOD_TIMER_BASE;
void PWM_ABC_StopAllClose(void)
{
EALLOW;
EPwmRegs[PWM_A]->TZCTL.bit.TZA = 2;
EPwmRegs[PWM_A]->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;
EPwmRegs[PWM_A]->TZFRC.all = 4;
EPwmRegs[PWM_B]->TZFRC.all = 4;
EPwmRegs[PWM_C]->TZFRC.all = 4;
// EPwmRegs[PWM_A]->TZCTL.bit.TZA = 2;
// EPwmRegs[PWM_A]->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;
}
void PWM_ABC_StartOut(void)
{
EALLOW;
EPwmRegs[PWM_A]->TZCTL.bit.TZA = 3;
EPwmRegs[PWM_A]->TZCTL.bit.TZB = 3;
EPwmRegs[PWM_B]->TZCTL.bit.TZA = 3;
EPwmRegs[PWM_B]->TZCTL.bit.TZB = 3;
EPwmRegs[PWM_C]->TZCTL.bit.TZA = 3;
EPwmRegs[PWM_C]->TZCTL.bit.TZB = 3;
EPwmRegs[PWM_A]->TZCLR.all = 0x4;//
EPwmRegs[PWM_B]->TZCLR.all = 0x4;//
EPwmRegs[PWM_C]->TZCLR.all = 0x4;//
EDIS;
}
@ -80,6 +81,81 @@ void PWM_ABC_Start(uint16_t Num)
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)
{

View File

@ -28,7 +28,8 @@
#define SDFM_DELAY_mkS 50.0 //mkS
#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_MIN EPWM_DB*2
#define INDEPENDED 1
@ -73,7 +74,7 @@ void InitEPwm3Example(void);
void InitEPwm4Example(void);
void InitEPwm5Example(void);
void InitEPwm6Example(void);
void PWMTripInit(void);

View File

@ -5,7 +5,7 @@
* Author: seklyuts
*/
#include <pwm_init.h>
#include "f28x_project.h"
#include "frm_uart.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_2;
volatile strPWMABC PWM_motor = {PERIOD_2, PERIOD_2, PERIOD_2};
volatile uint16_t PeriodPWM_2 = PERIOD_DIV2;
volatile strPWMABC PWM_motor = {PERIOD_DIV2, PERIOD_DIV2, PERIOD_DIV2};
int16_t A_proc,B_proc,C_proc;
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(PeriodPWM[0] < PERIOD_2) PeriodPWM[0]=PERIOD_2;
if(PeriodPWM[0] > PERIOD_MOTOR) PeriodPWM[0]=PERIOD_MOTOR;
if(PeriodPWM[0] < PERIOD_DIV2) PeriodPWM[0]=PERIOD_DIV2;
if(PeriodPWM[0] > PERIOD_MAX) PeriodPWM[0]=PERIOD_MAX;
PeriodPWM[1] = PeriodPWM[0];
vectorRegKoeffRecalc(PeriodPWM[0]/PERIOD_MOTOR);
EALLOW;
@ -168,9 +168,9 @@ __interrupt void epwm2_isr(void)
AdcStartSet();
BissStartSet();
PWM_ABC_StopAllClose();
PWM_motor.UA = PERIOD_2;
PWM_motor.UB = PERIOD_2;
PWM_motor.UC = PERIOD_2;
PWM_motor.UA = PERIOD_DIV2;
PWM_motor.UB = PERIOD_DIV2;
PWM_motor.UC = PERIOD_DIV2;
vectorFault();
EPwmRegs[PWM_FAN]->CMPA.bit.CMPA = PERIOD_MOTOR - PWM_Vent;
// EPwmRegs[3]->CMPB.bit.CMPB = PERIOD_MOTOR - PWM_Chop;

View File

@ -11,6 +11,7 @@
#include "gpio_init.h"
#include "sdfm.h"
#include "vector.h"
#include "CLAinit.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(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};
union SDCPARM1_REG * SDCPARM_Reg_arr[8] = {
@ -88,11 +92,23 @@ volatile int16 * SdfmReadData[8] = {
(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
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 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 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;
@ -193,7 +209,7 @@ void SdfmInitInterruptEn(void)
void SdfmInit(void)
{
uint16_t HLT, LLT;
uint16_t HLT, LLT, Max, Min;
//
// Configure SDFM type to 0
//
@ -213,7 +229,14 @@ void SdfmInit(void)
//
// 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
LLT = 0x0000; //Under value threshold settings
@ -304,8 +327,126 @@ void SdfmInit(void)
Sdfm2Regs.SDDFPARM3.bit.FEN = 1;
Sdfm2Regs.SDDFPARM4.bit.FEN = 1;
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)
@ -313,11 +454,10 @@ void sdfmGetResult(uint16_t N)
uint16_t i = 0;
int32_t OffsetCount = 0;
// Gpio4out(1);
FilterResult[N][loopCounter[N]] = *SdfmReadData[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]++;
else
{
@ -337,12 +477,6 @@ void sdfmGetResult(uint16_t N)
SDDFPARM_Reg_arr[N]->bit.AE = 0;
EDIS;
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;
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]);
}
}
@ -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)
{
@ -390,10 +540,18 @@ uint16_t i;
uint32_t IntFlags;
IntFlags = Sdfm_readFlagRegister(SDFM1);
//Òóò íóæíà ïðîâåðêà íà 8 ìëàäøèõ åñëè õîòü 1 â åäèíèöå òî ìû èç ïðåðûâàíèÿ êîìïîðàòîðà è äåëî äðÿíü.
if((IntFlags&0xF)>0){
//ïðåðûâàíèå îò êîìïîðàòîðà ïîäãîòîâêà ôëàãîâ îøèáêè.
iterputErrorSost=((IntFlags&0xF)<<1);
//Ñêîðåå âñåãî íóæíà ïðîâåðêà ÷òî ìû â STOP
return;
}
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 & (0x100 << i)) sdfmErr(i);
if( (((uint16_t)IntFlags)&0xFF) != 0 ) sdfmOverCurrent();
Sdfm_clearFlagRegister(SDFM1,IntFlags);
sdfm_check_all_current_measurements_was_done();
@ -408,6 +566,12 @@ uint16_t i;
uint32_t IntFlags;
IntFlags = Sdfm_readFlagRegister(SDFM2);
if((IntFlags&0xF)>0){
//ïðåðûâàíèå îò êîìïîðàòîðà ïîäãîòîâêà ôëàãîâ îøèáêè.
iterputErrorSost=((IntFlags&0xF)<<1)+1;
//Ñêîðåå âñåãî íóæíà ïðîâåðêà ÷òî ìû â STOP
return;
}
sdfmIndex |= (IntFlags & 0xF000)>>8;
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;
}
int16_t sdfm_get_erors(int16_t N)
{
return iterputErrorSost;
}
int16_t sdfm_get(int16_t N)
{
if( N>=0 && N<=7 )
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_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_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 SDFM_FLT
void SdfmGpioInit(void);
void SdfmInitEnable(void);
void SdfmInitInterruptEn(void);
@ -74,7 +76,7 @@ void sdfm_start_conversion_current(void);
int16_t sdfm_get(int16_t N);
void SdfmTypeInit(void);
void sdfm_start_conversion_brake(void);
void sdfmInitPwmFlt(uint16_t N, uint16_t LowFLT, uint16_t HightFlt);
#endif /* SRC_SDFM_H_ */

View File

@ -9,7 +9,8 @@
#include "frm_uart.h"
#define LSPCLK_HZ 50000000.0
#define BAUD 57600.0
//#define BAUD 57600.0
#define BAUD 4000000.0
#define BRR LSPCLK_HZ/(BAUD*8) + 1
uint16_t frmEn = 0;

View File

@ -26,18 +26,18 @@ void frmmstr_run(void)
{
static uint16_t diod = 0;
// if(SciaRegs.SCIRXST.bit.RXERROR)
// {
// EALLOW;
// SciaRegs.SCICTL1.bit.SWRESET = 0;
// EDIS;
// }
// else
// {
// EALLOW;
// SciaRegs.SCICTL1.bit.SWRESET = 1;
// EDIS;
// }
if(SciaRegs.SCIRXST.bit.RXERROR)
{
EALLOW;
SciaRegs.SCICTL1.bit.SWRESET = 0;
EDIS;
}
else
{
EALLOW;
SciaRegs.SCICTL1.bit.SWRESET = 1;
EDIS;
}
if(FMSTRIsEnable())
{

View File

@ -27,6 +27,7 @@
#include "rele.h"
#include "i2c_oled.h"
#include "timersec.h"
#include "CLAinit.h"
extern uint16_t I2C_TXdata[];
extern uint16_t I2C_RXdata[];
@ -80,6 +81,7 @@ void InitPerif(void)
PWMAllInit();
PWMInitInterruptEn();
PWMTripInit();
SpiCInit();
@ -111,11 +113,12 @@ void InitPerif(void)
ERTM; // Enable Global realtime interrupt DBGM
I2CMasterInit(I2C_OWN_ADDRESS,0x3C);
CLA_Init();
/* Init LCD */
SSD1306_Init();
buttonsInit();
faultInit();
rele_initRele();
// SSD1306_Init();
// buttonsInit();
// faultInit();
// rele_initRele();
}

View File

@ -21,8 +21,7 @@
#include "temperature.h"
#include "rele.h"
#define IMAX_A 35.0 //A
#define IMAX (IMAX_A*BIT_MAX/FACTOR_CURRENT_MOTOR_A)
typedef struct {
int16_t Value16in; //
@ -84,6 +83,9 @@ float UdcVolt = 0;
volatile float VdcFactor = FACTOR_VDC;
volatile uint16_t VoltProcImit = 0;
uint32_t Impuls = 0;
uint32_t ImpulsHi = 0;
uint32_t ImpulsLow = 0;
uint32_t ImpulsStep = 0;
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);
Ib = -CurrentB;//sdfm_get(3);
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);
@ -146,6 +148,14 @@ void vectorControl(int16_t CurrentA, int16_t CurrentB, int16_t CurrentC, int16_t
}
else CurrLoop.piIq.Ref = CurrentRegTuneAmpl;
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:
PWM_ABC_StartOut();
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.Fbk = vectorIdq.q;
CurrLoop.piIq.Fbk = vectorIdq.q;// действующий ток
// CurrLoop.piId.Ref = 0;
CurrLoop.piId.Fbk = vectorIdq.d;
CurrLoop.piId.Fbk = vectorIdq.d;//
// CurrLoop.piId.Umax = CurrLoop.piIq.Umax = Inputs->Udc;
// 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 PI_REG_I_PROPOR 14.0 // 30
#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 IMAX_A_KZ 70.0 //A
#define IMAX_KZ (IMAX_A_KZ*BIT_MAX/FACTOR_CURRENT_MOTOR_A)
typedef struct
{
float q;
@ -76,8 +80,9 @@ typedef struct
typedef enum
{
OffMode, //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StepMode, //
OffMode,
StepMode,
StepModeImpulses,
StayMode,
CurrentRegTune,
TestPWNMode,

View File

@ -31,10 +31,12 @@ Rele.Error - появляется если после включение рел
Mode - режим работы.
0 - стоим, всё выключено,
1 - шаговый режим (задать ток CurrentRegTuneAmpl для шагового режима, скорость меняется через Nstep)
2 - режим поворота на заданный угол (задать ток CurrentRegTuneAmpl для шагового режима, угол поворота через vectorSinCos.angle)
3 - режим настройки регулятора тока
4 - шим по одному транзистору (панель TestPWM, см ниже)
6 - вращение по датчику с контуром тока (задать ток CurrentRegTuneAmpl)
2 - шаговый импульсный режим
3 - режим поворота на заданный угол (задать ток CurrentRegTuneAmpl для шагового режима, угол поворота через vectorSinCos.angle)
4 - режим настройки регулятора тока
5 - шим по одному транзистору (панель TestPWM, см ниже)
6 - зарезервировано (переключится в 0)
7 - вращение по датчику с контуром тока (задать ток CurrentRegTuneAmpl)
CurrentRegTuneAmpl - заданный ток для формирования поля когда включен контур тока
@ -46,6 +48,9 @@ NoLoop - отключение контура тока (возможность з
vectorUdq.q - поперечная составляющая напряжения, при включенном регуляторе тока формируется регулятором, при отключенном можно задавать вручную
vectorUdq.d - продольная составляющая напряжения, при включенном регуляторе тока формируется регулятором, при отключенном можно задавать вручную
___________________________________________
В шаговом режиме можно задать одиночный импульс с шагом 0.0001 с.
Impuls - время импульса тока в секундах (когда значение не равно нулю работает обратный отсчёт и ток = CurrentRegTuneAmplInpuls, когда равно нулю значение тока = CurrentRegTuneAmpl)
@ -54,6 +59,14 @@ CurrentRegTuneAmplInpuls - величина импульса тока в амп
AngleOffset - смещение датчика ротора относительно обмоток статора.
___________________________________________
Шаговый импульсный режим.
ток задаётся импульсами:
в течение времени ImpulsLow ток имеет значение CurrentRegTuneAmpl
в течение времени ImpulsHi ток имеет значение CurrentRegTuneAmplInpuls
время кратно 0.0001 с
___________________________________________
в левом окне блок TestPWM - в этом режиме можно включить ШИМ на любой транзистор.
Для этого нужно включить реле, выбрать Mode = 4.
После этого переменная Num обозначает -- какие из транзисторов включены.
@ -77,4 +90,10 @@ ___________________________________________
слева выбрать график I с биноклем который
после этого менять CurrLoop.piId.Kp и CurrLoop.piId.Ki чтобы изменить характеристику
___________________________________________
Измененние частоты ШИМ проводить при Mode = 0.
В других режимах частота меняться не будет.
Задаётся период в мкС от 50 до 125
В переменной PeriodPWM (слева выбрать вкладку timing)