From fff4c2afea6d3324d3e05dd3f767c40bd0742513 Mon Sep 17 00:00:00 2001 From: Jules-Ian Barnavon Date: Fri, 7 Apr 2023 10:47:02 +0200 Subject: [PATCH] =?UTF-8?q?Code=20DFT=20en=20c=20qui=20renvoie=20le=20modu?= =?UTF-8?q?le=20au=20carr=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PjtKEIL_StepDFT.zip | Bin 0 -> 29017 bytes PjtKEIL_StepDFT/Driver/DriverJeuLaser_1.h | 345 ++++++++++++++++++++ PjtKEIL_StepDFT/Driver/DriverJeuLaser_1.inc | 56 ++++ PjtKEIL_StepDFT/Obj/Signal.asm | 68 ++++ PjtKEIL_StepDFT/Signaux/Signal.asm | 68 ++++ PjtKEIL_StepDFT/Signaux/Signal.m | 38 +++ PjtKEIL_StepDFT/Src/DFT.s | 3 +- PjtKEIL_StepDFT/Src/principal.c | 17 +- PjtKEIL_StepDFT/StepDFT.uvprojx | 37 ++- PjtKEIL_StepDFT/rep_questions.md | 38 +++ PjtKEIL_StepDFT/rep_questions.txt | 0 11 files changed, 662 insertions(+), 8 deletions(-) create mode 100644 PjtKEIL_StepDFT.zip create mode 100644 PjtKEIL_StepDFT/Driver/DriverJeuLaser_1.h create mode 100644 PjtKEIL_StepDFT/Driver/DriverJeuLaser_1.inc create mode 100644 PjtKEIL_StepDFT/Obj/Signal.asm create mode 100644 PjtKEIL_StepDFT/Signaux/Signal.asm create mode 100644 PjtKEIL_StepDFT/Signaux/Signal.m create mode 100644 PjtKEIL_StepDFT/rep_questions.md create mode 100644 PjtKEIL_StepDFT/rep_questions.txt diff --git a/PjtKEIL_StepDFT.zip b/PjtKEIL_StepDFT.zip new file mode 100644 index 0000000000000000000000000000000000000000..131302125766eb4e1a20eac4838825f5f0e861f2 GIT binary patch literal 29017 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 +// Lance timer +#define Run_Timer(Timer) Timer->CR1=(Timer->CR1)|(1<<0) + + + +/** + * @brief Associe une fonction d'interruption (callback) lors du débordement d'un timer + * @note + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min) + * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption + * @retval None + */ +void Active_IT_Debordement_Timer( TIM_TypeDef *Timer, char Prio, void (*IT_function)(void) ); + + + + + + + + + + + +//********************************************************************************************************* +//--------------------- PWM TIM1 to TIM 4 ------------------------------ +//********************************************************************************************************* + +/** + * @brief Configure un timer en PWM + * @note + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param voie : un des 4 canaux possibles 1 à 4. + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval Retourne la période en tick (normalement la même que le param d'entrée sauf si PSC utilisé + */ +unsigned short int PWM_Init_ff( TIM_TypeDef *Timer, char Voie, u32 Periode_ticks ); + + + +/** + * @brief Fixe une valeur de PWM, Val, en tick horloge. La rapport cyclique effectif + * est donc : rcy = Thaut_ticks / Periode_ticks + * @note spécifique Jeu Laser, PWM liée exclusivement au TIM3, chan3 + * @param Thaut_ticks : durée de l'état haut d'une impulsion en Ticks + * @retval None + */ +void PWM_Set_Value_TIM3_Ch3( unsigned short int Thaut_ticks); + + + + + + + + + +//********************************************************************************************************** +//--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Configure le timer Systick avec une périodicité donnée + * @note Ce timer ne peut servir qu'à créer des temporisations ou générer des interruption + * ce n'est pas à proprement parler un périphérique, il fait partie du Cortex M3 + * Ce timer est un 24 bits + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour établir la périodicité + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ +void Systick_Period_ff( unsigned int Periode_ticks ); + + + +/** + * @brief Associe une fonction d'interruption (callback) lors du débordement du Systick + * @note + * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min) + * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption + * @retval None + */ +void Systick_Prio_IT( char Prio, void (*Systick_function)(void) ); + + +/** + * Macros de base pour utiliser le Systick + */ +#define SysTick_On ((SysTick->CTRL)=(SysTick->CTRL)|1<<0) +#define SysTick_Off ((SysTick->CTRL)=(SysTick->CTRL)& ~(1<<0)) +#define SysTick_Enable_IT ((SysTick->CTRL)=(SysTick->CTRL)|1<<1) +#define SysTick_Disable_IT ((SysTick->CTRL)=(SysTick->CTRL)& ~(1<<1)) + + + + + + + + + + + + + + +//********************************************************************************************************** +//--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Active l'ADC du STM32, configure la durée de prélèvement de l'échantillon (temps + * de fermeture du switch d'acquisition + * @note + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Duree_Ech_ticks : dirée de fermeture du switch d'échantillonnage en Tick d'horloge CPU + * exemple pour 1µs on choisira 72. + * @retval Nombre de Tick réellement pris en compte + */ +unsigned int Init_TimingADC_ActiveADC_ff( ADC_TypeDef * ADC, u32 Duree_Ech_ticks ); + + +/** + * @brief Sélectionne la voie à convertir + * @note Attention, la voie va de 0 à 15 et n'est pas directement lié au n°de GPIO + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Voie_ADC : 1 à 15 + * @retval None + */ +void Single_Channel_ADC( ADC_TypeDef * ADC, char Voie_ADC ); + + + + + +/** + * @brief Permet lier le déclenchement au débordement d'un timer, spécifie également + * la période de débordement du timer + * @note pas besoin de régler le timer avec une autre fonction dédiée timer + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Source : indique le timer qui déclenche l'ADC choix dans les define ci-dessous + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ + +// param pour Source : +#define TIM1_CC1 0 +#define TIM1_CC2 1 +#define TIM1_CC3 2 +#define TIM2_CC2 3 +#define TIM4_CC4 5 +void Init_Conversion_On_Trig_Timer_ff( ADC_TypeDef * ADC, char Source, u32 Periode_ticks ); + + + + + + + + + + + + + + + +//********************************************************************************************************** +//--------------------- ANALOG INPUT ADC & DMA ------------------------------ +//********************************************************************************************************** + +/** + * @brief Permer de lier l'ADC à un tableau en RAM pour une DMA + * @note + * @param Circ : circular. Si '0', en fin de DMA le ptr d'@ reste inchangé + * si '1' le ptr d'@ se recale à celle du début. + * @param Ptr_Table_DMA : contient l'@ de début de zone RAM à écrire + * @retval None + */ +void Init_ADC1_DMA1(char Circ, short int *Ptr_Table_DMA); + + + + + +/** + * @brief Lance une DMA sur le nombre de points spécifie. Les resultats seront stockes + * dans la zone de RAM écrite est indiquée lors de l'appel de la fonction Init_ADC1_DMA1 + * @note + * @param NbEchDMA est le nombre d'échantillons à stocker. + * @retval None + */ +void Start_DMA1( u16 NbEchDMA ); + +// arret DMA +#define Stop_DMA1 DMA1_Channel1->CCR =(DMA1_Channel1->CCR) &~0x1; + + +/** + * @brief Attend la fin d'un cycle de DMA. la duree depend de la periode d'acquisition + * et du nombre d'echantillons + * @note fonction d'attente (bloquante) + * @param None + * @retval None + */ +void Wait_On_End_Of_DMA1(void); + + + + + + + + +//********************************************************************************************************** +//--------------------- GPIO ------------------------------ +//********************************************************************************************************** + +/** + * @brief Initialisation d'un GPIO (A à C), pin x. + * peut être configuré : + * -> Input ou output + * -> architecture technologique (push-pull, open drain...) + + * @note + * @param Port : GPIOA, GPIOB, GPIOC + * @param Broche : 0 à 15 + * @param Sens : INPUT ou OUTPUT + * @param Techno : voir define ci dessous + * @retval 1 erreur, 0 si OK + */ + +// Sens +#define INPUT 'i' +#define OUTPUT 'o' + +// Techno pour pin en entrée (INPUT) +#define ANALOG 0 +#define INPUT_FLOATING 1 +#define INPUT_PULL_DOWN_UP 2 + +// Techno pour pin en sortie (OUTPUT) +#define OUTPUT_PPULL 0 +#define OUTPUT_OPDRAIN 1 +#define ALT_PPULL 2 +#define ALT_OPDRAIN 3 + +// Exemple : +// Port_IO_Init(GPIOB, 8, OUTPUT, OUTPUT_PPULL); +// Place le bit 8 du port B en sortie Push-pull +char GPIO_Configure(GPIO_TypeDef * Port, int Broche, int Sens, int Techno); + + +/** + * @brief Mise à 1 d'une broche GPIO + * @note Une fonction par GPIO + * @param Broche : 0 à 15 + * @retval None + */ + +void GPIOA_Set(char Broche); +void GPIOB_Set(char Broche); +void GPIOC_Set(char Broche); + + + +/** + * @brief Mise à 0 d'une broche GPIO + * @note Une fonction par GPIO + * @param Broche : 0 à 15 + * @retval None + */ + +void GPIOA_Clear(char Broche); +void GPIOB_Clear(char Broche); +void GPIOC_Clear(char Broche); + + +#endif + + diff --git a/PjtKEIL_StepDFT/Driver/DriverJeuLaser_1.inc b/PjtKEIL_StepDFT/Driver/DriverJeuLaser_1.inc new file mode 100644 index 0000000..48d5e50 --- /dev/null +++ b/PjtKEIL_StepDFT/Driver/DriverJeuLaser_1.inc @@ -0,0 +1,56 @@ + +; Bibliotheque DriverJeuLaser (ancienne gassp72 adaptée 2021 - TR) +; Accès en aux fonctions suivantes : +; GPIO : +; GPIOA_Set(char Broche), GPIOB_Set(char Broche), GPIOC_Set(char Broche) +; GPIOA_Clear(char Broche), GPIOB_Clear(char Broche), GPIOC_Clear(char Broche) + +; PWM : +;/** +; * @brief Fixe une valeur de PWM, Val, en tick horloge. La rapport cyclique effectif +; * est donc : rcy = Thaut_ticks / Periode_ticks +; * @note spécifique Jeu Laser, PWM liée exclusivement au TIM3, chan3 +; * @param Thaut_ticks : durée de l'état haut d'une impulsion en Ticks +; * @retval None +; */ + +;void PWM_Set_Value_TIM3_Ch3( unsigned short int Thaut_ticks); + import PWM_Set_Value_TIM3_Ch3 + + + +;/** +; * @brief Mise à 1 d'une broche GPIO +; * @note Une fonction par GPIO +; * @param Broche : 0 à 15 +; * @retval None +; */ + +;void GPIOA_Set(char Broche); + import GPIOA_Set + +;void GPIOB_Set(char Broche); + import GPIOB_Set + +;void GPIOC_Set(char Broche); + import GPIOC_Set + + + +;/** +; * @brief Mise à 0 d'une broche GPIO +; * @note Une fonction par GPIO +; * @param Broche : 0 à 15 +; * @retval None +; */ + +;void GPIOA_Clear(char Broche); + import GPIOA_Clear + +;void GPIOB_Clear(char Broche); + import GPIOB_Clear + +;void GPIOC_Clear(char Broche); + import GPIOC_Clear + + end diff --git a/PjtKEIL_StepDFT/Obj/Signal.asm b/PjtKEIL_StepDFT/Obj/Signal.asm new file mode 100644 index 0000000..afe6352 --- /dev/null +++ b/PjtKEIL_StepDFT/Obj/Signal.asm @@ -0,0 +1,68 @@ + AREA Signal, DATA, READONLY + export LeSignal +LeSignal + DCW 0x0fff ; 0 4095 0.99976 + DCW 0x0737 ; 1 1847 0.45093 + DCW 0x0027 ; 2 39 0.00952 + DCW 0x0a53 ; 3 2643 0.64526 + DCW 0x0f64 ; 4 3940 0.96191 + DCW 0x043b ; 5 1083 0.26440 + DCW 0x0159 ; 6 345 0.08423 + DCW 0x0d13 ; 7 3347 0.81714 + DCW 0x0da8 ; 8 3496 0.85352 + DCW 0x01d1 ; 9 465 0.11353 + DCW 0x038e ; 10 910 0.22217 + DCW 0x0f0e ; 11 3854 0.94092 + DCW 0x0b10 ; 12 2832 0.69141 + DCW 0x0058 ; 13 88 0.02148 + DCW 0x0670 ; 14 1648 0.40234 + DCW 0x0ff6 ; 15 4086 0.99756 + DCW 0x0800 ; 16 2048 0.50000 + DCW 0x000a ; 17 10 0.00244 + DCW 0x0990 ; 18 2448 0.59766 + DCW 0x0fa8 ; 19 4008 0.97852 + DCW 0x04f0 ; 20 1264 0.30859 + DCW 0x00f2 ; 21 242 0.05908 + DCW 0x0c72 ; 22 3186 0.77783 + DCW 0x0e2f ; 23 3631 0.88647 + DCW 0x0258 ; 24 600 0.14648 + DCW 0x02ed ; 25 749 0.18286 + DCW 0x0ea7 ; 26 3751 0.91577 + DCW 0x0bc5 ; 27 3013 0.73560 + DCW 0x009c ; 28 156 0.03809 + DCW 0x05ad ; 29 1453 0.35474 + DCW 0x0fd9 ; 30 4057 0.99048 + DCW 0x08c9 ; 31 2249 0.54907 + DCW 0x0000 ; 32 0 0.00000 + DCW 0x08c9 ; 33 2249 0.54907 + DCW 0x0fd9 ; 34 4057 0.99048 + DCW 0x05ad ; 35 1453 0.35474 + DCW 0x009c ; 36 156 0.03809 + DCW 0x0bc5 ; 37 3013 0.73560 + DCW 0x0ea7 ; 38 3751 0.91577 + DCW 0x02ed ; 39 749 0.18286 + DCW 0x0258 ; 40 600 0.14648 + DCW 0x0e2f ; 41 3631 0.88647 + DCW 0x0c72 ; 42 3186 0.77783 + DCW 0x00f2 ; 43 242 0.05908 + DCW 0x04f0 ; 44 1264 0.30859 + DCW 0x0fa8 ; 45 4008 0.97852 + DCW 0x0990 ; 46 2448 0.59766 + DCW 0x000a ; 47 10 0.00244 + DCW 0x0800 ; 48 2048 0.50000 + DCW 0x0ff6 ; 49 4086 0.99756 + DCW 0x0670 ; 50 1648 0.40234 + DCW 0x0058 ; 51 88 0.02148 + DCW 0x0b10 ; 52 2832 0.69141 + DCW 0x0f0e ; 53 3854 0.94092 + DCW 0x038e ; 54 910 0.22217 + DCW 0x01d1 ; 55 465 0.11353 + DCW 0x0da8 ; 56 3496 0.85352 + DCW 0x0d13 ; 57 3347 0.81714 + DCW 0x0159 ; 58 345 0.08423 + DCW 0x043b ; 59 1083 0.26440 + DCW 0x0f64 ; 60 3940 0.96191 + DCW 0x0a53 ; 61 2643 0.64526 + DCW 0x0027 ; 62 39 0.00952 + DCW 0x0737 ; 63 1847 0.45093 + END diff --git a/PjtKEIL_StepDFT/Signaux/Signal.asm b/PjtKEIL_StepDFT/Signaux/Signal.asm new file mode 100644 index 0000000..5a79596 --- /dev/null +++ b/PjtKEIL_StepDFT/Signaux/Signal.asm @@ -0,0 +1,68 @@ + AREA Signal, DATA, READONLY + export LeSignal +LeSignal + DCW 0x0fff ; 0 4095 0.99976 + DCW 0x0ff6 ; 1 4086 0.99756 + DCW 0x0fd9 ; 2 4057 0.99048 + DCW 0x0fa8 ; 3 4008 0.97852 + DCW 0x0f64 ; 4 3940 0.96191 + DCW 0x0f0e ; 5 3854 0.94092 + DCW 0x0ea7 ; 6 3751 0.91577 + DCW 0x0e2f ; 7 3631 0.88647 + DCW 0x0da8 ; 8 3496 0.85352 + DCW 0x0d13 ; 9 3347 0.81714 + DCW 0x0c72 ; 10 3186 0.77783 + DCW 0x0bc5 ; 11 3013 0.73560 + DCW 0x0b10 ; 12 2832 0.69141 + DCW 0x0a53 ; 13 2643 0.64526 + DCW 0x0990 ; 14 2448 0.59766 + DCW 0x08c9 ; 15 2249 0.54907 + DCW 0x0800 ; 16 2048 0.50000 + DCW 0x0737 ; 17 1847 0.45093 + DCW 0x0670 ; 18 1648 0.40234 + DCW 0x05ad ; 19 1453 0.35474 + DCW 0x04f0 ; 20 1264 0.30859 + DCW 0x043b ; 21 1083 0.26440 + DCW 0x038e ; 22 910 0.22217 + DCW 0x02ed ; 23 749 0.18286 + DCW 0x0258 ; 24 600 0.14648 + DCW 0x01d1 ; 25 465 0.11353 + DCW 0x0159 ; 26 345 0.08423 + DCW 0x00f2 ; 27 242 0.05908 + DCW 0x009c ; 28 156 0.03809 + DCW 0x0058 ; 29 88 0.02148 + DCW 0x0027 ; 30 39 0.00952 + DCW 0x000a ; 31 10 0.00244 + DCW 0x0000 ; 32 0 0.00000 + DCW 0x000a ; 33 10 0.00244 + DCW 0x0027 ; 34 39 0.00952 + DCW 0x0058 ; 35 88 0.02148 + DCW 0x009c ; 36 156 0.03809 + DCW 0x00f2 ; 37 242 0.05908 + DCW 0x0159 ; 38 345 0.08423 + DCW 0x01d1 ; 39 465 0.11353 + DCW 0x0258 ; 40 600 0.14648 + DCW 0x02ed ; 41 749 0.18286 + DCW 0x038e ; 42 910 0.22217 + DCW 0x043b ; 43 1083 0.26440 + DCW 0x04f0 ; 44 1264 0.30859 + DCW 0x05ad ; 45 1453 0.35474 + DCW 0x0670 ; 46 1648 0.40234 + DCW 0x0737 ; 47 1847 0.45093 + DCW 0x0800 ; 48 2048 0.50000 + DCW 0x08c9 ; 49 2249 0.54907 + DCW 0x0990 ; 50 2448 0.59766 + DCW 0x0a53 ; 51 2643 0.64526 + DCW 0x0b10 ; 52 2832 0.69141 + DCW 0x0bc5 ; 53 3013 0.73560 + DCW 0x0c72 ; 54 3186 0.77783 + DCW 0x0d13 ; 55 3347 0.81714 + DCW 0x0da8 ; 56 3496 0.85352 + DCW 0x0e2f ; 57 3631 0.88647 + DCW 0x0ea7 ; 58 3751 0.91577 + DCW 0x0f0e ; 59 3854 0.94092 + DCW 0x0f64 ; 60 3940 0.96191 + DCW 0x0fa8 ; 61 4008 0.97852 + DCW 0x0fd9 ; 62 4057 0.99048 + DCW 0x0ff6 ; 63 4086 0.99756 + END diff --git a/PjtKEIL_StepDFT/Signaux/Signal.m b/PjtKEIL_StepDFT/Signaux/Signal.m new file mode 100644 index 0000000..016fc56 --- /dev/null +++ b/PjtKEIL_StepDFT/Signaux/Signal.m @@ -0,0 +1,38 @@ +clc +clear + +N = 64 %input('Nombre d''échantilllons pour ce signal : '); +Frel = input('Fréquence normalisée (nombre de périodes dans la durée totale) : '); +Ph0 = input('Phase a l''origine (en degrés) : '); +Ph0 = Ph0 * pi / 180.0; % a present en radian + +Ampl = 2048; +Offset = 2048; +%% Création du fichier .asm + +fileID = fopen(['Signalech64.asm'], 'w'); +fprintf(fileID,'\tAREA Signal, DATA, READONLY\n'); +fprintf(fileID,'\texport LeSignal\n'); + +fprintf(fileID,'LeSignal\n'); + +for i = 1: N + % fonction a modifier en fonction des besoins + Sig(i) = Offset + Ampl * cos( 2*pi*Frel*(i-1)/N + Ph0 ); + % arrondi + iSig = int16(Sig(i)); + % bornage du signal similaire a la sortie brute de l'ADC 12 bits + if ( iSig < 0 ) + iSig = 0; + end + if ( iSig > 4095 ) + iSig = 4095; + end + + fprintf(fileID,'\tDCW\t0x%04x\t; %2d %4d %7.5f\n',iSig, i-1, iSig, double(iSig) / 4096.0 ); + +end + +fprintf(fileID,'\tEND\n'); +fclose(fileID); +plot(Sig); \ No newline at end of file diff --git a/PjtKEIL_StepDFT/Src/DFT.s b/PjtKEIL_StepDFT/Src/DFT.s index 3f6b5d4..d6139eb 100644 --- a/PjtKEIL_StepDFT/Src/DFT.s +++ b/PjtKEIL_StepDFT/Src/DFT.s @@ -28,7 +28,8 @@ ;Section ROM code (read only) : AREA Trigo, DATA, READONLY ; codage fractionnaire 1.15 - + export TabCos + export TabSin TabCos DCW 32767 ; 0 0x7fff 0.99997 DCW 32610 ; 1 0x7f62 0.99518 diff --git a/PjtKEIL_StepDFT/Src/principal.c b/PjtKEIL_StepDFT/Src/principal.c index d09be75..0a9b367 100644 --- a/PjtKEIL_StepDFT/Src/principal.c +++ b/PjtKEIL_StepDFT/Src/principal.c @@ -1,8 +1,21 @@ #include "DriverJeuLaser.h" +#include "stdio.h" +extern short int LeSignal[]; +extern short int TabCos[]; +extern short int TabSin[]; +int DFT_ModuleAuCarre( short int * Signal64ech, char k){ + int acumReel = 0; + int acumImag = 0; + for (int i= 0; i< 64; i++){ + acumReel += Signal64ech[i]*TabCos[(i*k)%64]; + acumImag += Signal64ech[i]*TabSin[(i*k)%64]; + } + return acumReel*acumReel + acumImag*acumImag; +} int main(void) { @@ -15,7 +28,9 @@ int main(void) CLOCK_Configure(); - + + +printf("%d\n", DFT_ModuleAuCarre(LeSignal,17)); //============================================================================ diff --git a/PjtKEIL_StepDFT/StepDFT.uvprojx b/PjtKEIL_StepDFT/StepDFT.uvprojx index dd4f900..715dd05 100644 --- a/PjtKEIL_StepDFT/StepDFT.uvprojx +++ b/PjtKEIL_StepDFT/StepDFT.uvprojx @@ -10,7 +10,7 @@ Simu 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::.\ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARMCC 0 @@ -388,6 +388,16 @@ 1 .\Src\principal.c + + Signal.asm + 2 + .\Obj\Signal.asm + + + DFT.s + 2 + .\Src\DFT.s + @@ -797,6 +807,16 @@ 1 .\Src\principal.c + + Signal.asm + 2 + .\Obj\Signal.asm + + + DFT.s + 2 + .\Src\DFT.s + @@ -1275,6 +1295,16 @@ 1 .\Src\principal.c + + Signal.asm + 2 + .\Obj\Signal.asm + + + DFT.s + 2 + .\Src\DFT.s + @@ -1323,11 +1353,6 @@ <Project Info> - - - - - 0 1 diff --git a/PjtKEIL_StepDFT/rep_questions.md b/PjtKEIL_StepDFT/rep_questions.md new file mode 100644 index 0000000..84c5166 --- /dev/null +++ b/PjtKEIL_StepDFT/rep_questions.md @@ -0,0 +1,38 @@ +1. Déterminer les 6 valeurs de k (k1 à k6) correspondant aux 6 fréquences des pistolets ( voir votre +rapport intermédiaire ou le sujet signal de la partie I, sur Moodle) + +Les valeurs de k qui nous interessent sont : + +Fréquence (en kHz) | 85 | 90 | 95 | 100 | 115| 120 | +|---|---|---|---|---|---|---| +| K | 17 | 18 | 19 | 20 | 23 | 24 | + +La graduation des fréquence est donnée par +$$ +\delta \omega = \frac{1}{T} = 5000 kHz +$$ + +ainsi: + +$$ +k_n = \frac{f_n}{5000 kHz} +$$ + +2. Le codage fonctionne de la même maniére que le complément à deux avec des valeur fractionnaire. +Considérons un codage A.B sur x bits +Les nombre de ce codage étant représentés par : +$b_{x-1}b_{x-2} \dots b_2b_1b_0$ + +Si le nombre est compris entre 00000...0 et 0111...1 +La valeur décimale du nombre est donnée par : +$$\sum_{i=0}^{x-1} b_i \times 2^{i-B}$$ +Et si le nombre est compris entre 100..00 et 11...111 + +La valeur décimale du nombre est donnée par : +$$-\sum_{i=0}^{x-1} (b_i-1) \times 2^{i-B}$$ + +$$0x02C1 \to 0b 0000 0010 1100 0001 \to 2^{-3}+2^{-5}+2^{-6}+2^{-12}= 0.172119140625$$ + +$$0xFE01 \to 0b 1111 1110 0000 0001 \to \sum^{-4}_{i=-11} 2^{i} \text{car nombre négatif} = -0.124755859375$$ + + diff --git a/PjtKEIL_StepDFT/rep_questions.txt b/PjtKEIL_StepDFT/rep_questions.txt new file mode 100644 index 0000000..e69de29