From b4bbe14b67374c76db52d9aa517a876bbc70efd6 Mon Sep 17 00:00:00 2001 From: seklyuts Date: Thu, 29 Aug 2024 16:55:31 +0300 Subject: [PATCH] =?UTF-8?q?SDFM-PWM=20FLT=20=D0=B7=D0=B0=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Peripherals/gpio_init.c | 2 + .../src/Peripherals/pwm_init.h | 39 ++- .../src/Peripherals/pwm_interrupts.c | 26 +- .../epwm_test_biss_c_cpu1/src/init_perif.c | 3 +- Projects/epwm_test_biss_c_cpu2/Start_rfm.pmp | Bin 58764 -> 59925 bytes .../src/ExternalEEPROM/BL25CM1A.c | 2 +- .../src/ExternalEEPROM/GD25Q16ETIGR.c | 223 +++++++++++++----- .../src/ExternalEEPROM/GD25Q16ETIGR.h | 4 +- .../src/ExternalEEPROM/ZD24C02A.c | 42 ++-- .../src/ExternalEEPROM/ZD24C02A.h | 6 +- .../src/Peripherals/pwm_init.c | 9 + .../src/Peripherals/pwm_init.h | 5 +- .../src/Peripherals/pwm_interrupts.c | 16 +- .../src/Peripherals/sdfm.c | 123 +++++++++- .../src/Peripherals/sdfm.h | 8 +- .../epwm_test_biss_c_cpu2/src/init_perif.c | 1 + Projects/epwm_test_biss_c_cpu2/src/vector.c | 5 +- Projects/epwm_test_biss_c_cpu2/src/vector.h | 6 +- .../Описание проекта freemaster.txt | 6 + 19 files changed, 405 insertions(+), 121 deletions(-) diff --git a/Projects/epwm_test_biss_c_cpu1/src/Peripherals/gpio_init.c b/Projects/epwm_test_biss_c_cpu1/src/Peripherals/gpio_init.c index c65970f..e3a39ad 100644 --- a/Projects/epwm_test_biss_c_cpu1/src/Peripherals/gpio_init.c +++ b/Projects/epwm_test_biss_c_cpu1/src/Peripherals/gpio_init.c @@ -73,6 +73,8 @@ void GpioSetOrange(void) + + void GpioInit(void) { EALLOW; diff --git a/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_init.h b/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_init.h index 8696822..6c9d862 100644 --- a/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_init.h +++ b/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_init.h @@ -1,7 +1,7 @@ /* * pwm_init.h * - * Created on: 21 . 2023 . + * Created on: 21 ���. 2023 �. * 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); diff --git a/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_interrupts.c b/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_interrupts.c index f91bd46..46233f4 100644 --- a/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_interrupts.c +++ b/Projects/epwm_test_biss_c_cpu1/src/Peripherals/pwm_interrupts.c @@ -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; diff --git a/Projects/epwm_test_biss_c_cpu1/src/init_perif.c b/Projects/epwm_test_biss_c_cpu1/src/init_perif.c index 6f3833d..4baf734 100644 --- a/Projects/epwm_test_biss_c_cpu1/src/init_perif.c +++ b/Projects/epwm_test_biss_c_cpu1/src/init_perif.c @@ -17,6 +17,7 @@ #include "i2c_init.h" #include "spi_init.h" #include "biss.h" +#include "sdfm_pwm_xbar.h" #define TO_CPU1 0 @@ -116,7 +117,7 @@ void InitPerif(void) SpiCGpioInit(); BissGpioInit(); BissInit(); - + sdfm_pwm_xbarInit(); // ConfigureADC(); diff --git a/Projects/epwm_test_biss_c_cpu2/Start_rfm.pmp b/Projects/epwm_test_biss_c_cpu2/Start_rfm.pmp index 200870dedaa44c57d9695537e03a0c83932efd9e..060700f4c9950623913e526f5ab43a1f9007e407 100644 GIT binary patch delta 4128 zcmbuBe^69a6vxkdZw2`w2w5V|jtk_NU}Blq6+#R|(@axHpZ!2Hmr9yYll%e0m{UxnP=kph{g8DJ+=lWsnrFs{4bksLXx0p>D!(M;y zc-SB*_ChP`=y{a68zz|ls*#9jHUHE8iziuoVh0=2ls{?)*`B7fd!IAqp-Q_)f z&Z*qT*OE*$iWP249{msv_YuW%%V!^g`hV;zk)t6D2Bc_kgkMen&0#q&)CdPG-WsgN$m_|ID{03 z(HhLX7UTuxgWf`9GuzOd6I>K+$F$FXUzBjNV$M0BEg%Nk403~(8^m(_W+ldFRx5VY z%MlzT$x62+W;>tGH!f9OzAHIkHWfRoJ*;D2hT6A#uB^Sn`djnW>b<#gxb~Vd-@)QK zXR3ei3wYIn1Mlj?)c)2ja-=q7n0>j^>CopmdT4IYwxp`;Ri|z%I8tTQ2n(#n5SHWd zkmV57QfvH78V3>;R0A6p&`U4CxDyl&5=HkWY-2&95G}BYl6)Js6wr&HMLK!4hMEuK zkDw$F>X{yfZ4>A_&?BG?pi)pWXc~x@hd0>Mr(qP;jG77QqZW)agGAL&g6#)TKj=H$i!zbWk}c5i~<5z1GC;KL&ReXfkLCC==8S5*s}owj9tp&@9k;8a^smYc3cw zppApf=`U71z9#JiQUCO>(WFFw2p%W7vgTEzJF$u05-)>n2r00`y8u+ElfI9yz$kiL$bB)qB_PqxqIKVaSM*#FY~m2B zfQ_Hs%<3PLpmn5@nVrS&2p(Fg-#`@Ja3|H4uFcw3on$RtS?Y>2YvgEdmBRT@huh`S zg+IN!O16oUPuoZF!~=vp>GzmB?js71W%SNUkS9<{lXan(ZMEAeiW+G zlIS#@rE7e4iRalZnY62)o=)v~oI^v`hA1AuNT&&O3e*kS4iehlW!RE=w#GE4LDxWB zJ8{!G*7HP~Sg(7o9&Ukoy{qs0_K{3qAeWCoUx9Xl+CYBLK7+i}ZXkUKItJPcIu800 z)CxKb5~t${*mi?H10B#wZ=F3b9tCxPJ_YRuiBsyK36uzm07ZdfKye^(?o8Be Z_*tjdp{sCIn-Yx(D delta 3720 zcmbu>eN0tl90%~EL$T2kzxAme; zbnY>eD}+dCLX>#KS8itAVxeU^6ph)eW{dpG)+o2ydd@lb`99a}ZUo)!p8Gk!=iKu= z=RD8vd7gKAwN0lqEslsRpO z-ugxS_Al#c?-k6(XwUU-MU< zspc7brawvhvv!bOX_%KR%Xm@X%2uur|FiBno0n<)8%D7#zcC@!MVg0bG>_a4-9Z}D z2c}qc9BjN_i8MO8>r~cs>`vXTu8Ci6eq`lCRp+1<-2N)`GxRmI7J3p&6pALlAUzk< z%B<$qytOXoZ%!?;8`W&La2QRzght{KJ7pvQy7I-OUZ<(L}{!$`n3+}lH zDuGr(49bAE3b8i^;xvcHWvp)5u3CuNQ>Qw3L9K zF3PGXFJzw1RO8+Kk6UGIMq8#a%Sg8`T-zD=NA!`yYT#j+{j9@y*jcn#G?<#93DBF6 z94X%-7B8gJZb7;SlKr&_vB}U<=xL}MIt`tHWN%DG%U zs4-uQ(kak7=o`}XK(>ZRj-cF_gulo!^c7;8A)Z5l`z1hfgpES%5;Xa3@JDDFbeEkP zPCh+RSnh)KCn%oX>YJve(L$E$i;W;s$>Aww*Zppz$+uKhN{xR`{31rx@KY$BW}zDt>x*(l9|o`qyK%5~>0tJF&Leq0zT-&Uej=35S8 zGV?AYmJ7+u3zcPjIb|CM#>JUwq`4RHAw*TQ#@Y~QJb$_rGiXlPY*lZ#G4V{g8d)9` zHCoTEH@mdUnBIF-&6X>Y*_rZ;*AjGQ?JaKFBbb$n`JozG6P)6YX5{8l6f5Y9;i;|g zrga;7-=UG`a}<4tiW(p}m7hjTPS#$;8iic6Q;>R~Q$d6O@9*a%$u}|Nd%>P-Lx1&% z*ZYK^g|7vz`V^8Y+kV8_paViW9TlX5(1*}T$Or9$jzAwl`=Db`C-eby$dZ*A?Fe>3 zd!bLD!_fOsD|7I*lwqG6}?(k@;l4osXoIh0jpJD$ws`~=s z%O^I)e_TmjGK|4yJ z9Odu~Qbb|-D`izh6;|VayNbs5m`TY$_KP0NC##|6D;G^b4KYvzLOnhw=lnr1Fwa#gq+#d1Nnm+|fY0(=Z+ivR!s diff --git a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/BL25CM1A.c b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/BL25CM1A.c index 63feb1c..e5923a6 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/BL25CM1A.c +++ b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/BL25CM1A.c @@ -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; // - diff --git a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.c b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.c index 43f0100..6ab5a32 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.c +++ b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.c @@ -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>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 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); diff --git a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.h b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.h index 1236763..3564d8b 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.h +++ b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/GD25Q16ETIGR.h @@ -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); diff --git a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.c b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.c index 9d52f56..4a7e923 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.c +++ b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.c @@ -1,7 +1,7 @@ /* * ZD24C02A.c * - * Created on: 8 . 2023 . + * Created on: 8 ����. 2023 �. * 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)// ����� ������ ��������� �� 16 ���� { 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 + {//� ���� ����� ������ ������ ������� �� 8 ���� 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 + {//��� �.�. �� 1 �� 8 ���� 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 + {//� ���� ����� ������ ������ ������� �� 8 ���� 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 + {//��� �.�. �� 1 �� 8 ���� 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++; }//���� ���� �������� �����, �� ��������� �� ������� ���� 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 + {//� ���� ����� ������ ������ ������� �� 8 ���� 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 + {//��� �.�. �� 1 �� 8 ���� 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); diff --git a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.h b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.h index e89a573..80e69d5 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.h +++ b/Projects/epwm_test_biss_c_cpu2/src/ExternalEEPROM/ZD24C02A.h @@ -1,14 +1,16 @@ /* * ZD24C02A.h * - * Created on: 8 . 2023 . + * Created on: 8 ����. 2023 �. * 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 diff --git a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.c b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.c index 2d84520..9e05cde 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.c +++ b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.c @@ -82,6 +82,15 @@ void PWM_ABC_Start(uint16_t Num) } +void PWMTripInit(void) +{ + EALLOW; + EPwmRegs[PWM_A]->DCTRIPSEL.all = 0x3333; + EPwmRegs[PWM_B]->DCTRIPSEL.all = 0x3333; + EPwmRegs[PWM_C]->DCTRIPSEL.all = 0x3333; + EDIS; +} + void PWMAllInit(void) { // diff --git a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.h b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.h index 20a9cd7..4b290ce 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.h +++ b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_init.h @@ -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); diff --git a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_interrupts.c b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_interrupts.c index a7c2137..f16e560 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_interrupts.c +++ b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/pwm_interrupts.c @@ -5,7 +5,7 @@ * Author: seklyuts */ -#include + #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; diff --git a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.c b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.c index 5547be5..99ea526 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.c +++ b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.c @@ -193,7 +193,7 @@ void SdfmInitInterruptEn(void) void SdfmInit(void) { - uint16_t HLT, LLT; + uint16_t HLT, LLT, Max, Min; // // Configure SDFM type to 0 // @@ -213,7 +213,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 +311,118 @@ void SdfmInit(void) Sdfm2Regs.SDDFPARM3.bit.FEN = 1; Sdfm2Regs.SDDFPARM4.bit.FEN = 1; EDIS; + + sdfmInitPwmFlt(SDFM_IA, Max, Min); + sdfmInitPwmFlt(SDFM_IB, Max, Min); + sdfmInitPwmFlt(SDFM_IC, Max, Min); } +#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; + 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) @@ -315,7 +432,7 @@ void sdfmGetResult(uint16_t N) FilterResult[N][loopCounter[N]] = *SdfmReadData[N]; sdfmAdc[N] = FilterResult[N][loopCounter[N]] - sdfmOffset[N]; - if(N != SDFM_U_DC) { + if((N != SDFM_U_DC)&(N != SDFM_BRAKE)) { if(loopCounter[N] < MAX_SAMPLES) loopCounter[N]++; else { diff --git a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.h b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.h index 83967c9..e8a1a17 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.h +++ b/Projects/epwm_test_biss_c_cpu2/src/Peripherals/sdfm.h @@ -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_ */ diff --git a/Projects/epwm_test_biss_c_cpu2/src/init_perif.c b/Projects/epwm_test_biss_c_cpu2/src/init_perif.c index 73137a5..fbec75c 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/init_perif.c +++ b/Projects/epwm_test_biss_c_cpu2/src/init_perif.c @@ -80,6 +80,7 @@ void InitPerif(void) PWMAllInit(); PWMInitInterruptEn(); + PWMTripInit(); SpiCInit(); diff --git a/Projects/epwm_test_biss_c_cpu2/src/vector.c b/Projects/epwm_test_biss_c_cpu2/src/vector.c index 20bee70..09404c0 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/vector.c +++ b/Projects/epwm_test_biss_c_cpu2/src/vector.c @@ -21,8 +21,7 @@ #include "temperature.h" #include "rele.h" -#define IMAX_A 55.0 //A -#define IMAX (IMAX_A*BIT_MAX/FACTOR_CURRENT_MOTOR_A) + typedef struct { int16_t Value16in; // @@ -113,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); diff --git a/Projects/epwm_test_biss_c_cpu2/src/vector.h b/Projects/epwm_test_biss_c_cpu2/src/vector.h index ce39704..013a1f2 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/vector.h +++ b/Projects/epwm_test_biss_c_cpu2/src/vector.h @@ -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; diff --git a/Projects/epwm_test_biss_c_cpu2/Описание проекта freemaster.txt b/Projects/epwm_test_biss_c_cpu2/Описание проекта freemaster.txt index 587f4d1..32eb82c 100644 --- a/Projects/epwm_test_biss_c_cpu2/Описание проекта freemaster.txt +++ b/Projects/epwm_test_biss_c_cpu2/Описание проекта freemaster.txt @@ -90,4 +90,10 @@ ___________________________________________ слева выбрать график I с биноклем который после этого менять CurrLoop.piId.Kp и CurrLoop.piId.Ki чтобы изменить характеристику +___________________________________________ +Измененние частоты ШИМ проводить при Mode = 0. +В других режимах частота меняться не будет. + +Задаётся период в мкС от 50 до 125 +В переменной PeriodPWM (слева выбрать вкладку timing)