From 15bdf1de4a22912efe7ed7c95cec986dfce4d159 Mon Sep 17 00:00:00 2001 From: Olivier Chevilley Date: Thu, 13 Apr 2023 13:52:32 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20des=20derni=C3=A8res=20fonctionnalit?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Drivers/Inc/Lib_Com_Periph_2022.lib | Bin 0 -> 15036 bytes Drivers/Inc/MyI2C.h | 229 ++++++++++++++++++++++++++ Drivers/Inc/MySPI.h | 145 ++++++++++++++++ Drivers/Src/TIMER.c | 18 +- Drivers/Src/UART.c | 3 +- Projet_DevDrivers/Sources/Principal.c | 49 ------ Projet_voile/Includes/CAP_voilier.h | 11 ++ Projet_voile/Includes/Pwm_voile.h | 1 + Projet_voile/Includes/Rouli.h | 23 +++ Projet_voile/Sources/CAP_voilier.c | 52 ++++++ Projet_voile/Sources/Principal.c | 33 +++- Projet_voile/Sources/Pwm_voile.c | 26 ++- Projet_voile/Sources/Rouli.c | 43 +++++ Projet_voile/TP1.uvoptx | 74 +++++++-- Projet_voile/TP1.uvprojx | 63 ++++++- README.md | 22 +-- 16 files changed, 676 insertions(+), 116 deletions(-) create mode 100644 Drivers/Inc/Lib_Com_Periph_2022.lib create mode 100644 Drivers/Inc/MyI2C.h create mode 100644 Drivers/Inc/MySPI.h delete mode 100644 Projet_DevDrivers/Sources/Principal.c create mode 100644 Projet_voile/Includes/CAP_voilier.h create mode 100644 Projet_voile/Includes/Rouli.h create mode 100644 Projet_voile/Sources/CAP_voilier.c create mode 100644 Projet_voile/Sources/Rouli.c diff --git a/Drivers/Inc/Lib_Com_Periph_2022.lib b/Drivers/Inc/Lib_Com_Periph_2022.lib new file mode 100644 index 0000000000000000000000000000000000000000..ce805ab1d01ff2c58d03e536cca4cebe04e07b5e GIT binary patch literal 15036 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 literal 0 HcmV?d00001 diff --git a/Drivers/Inc/MyI2C.h b/Drivers/Inc/MyI2C.h new file mode 100644 index 0000000..289c9ed --- /dev/null +++ b/Drivers/Inc/MyI2C.h @@ -0,0 +1,229 @@ +#ifndef _I2C_ +#define _I2C_ + +#include "stm32f10x.h" + +/************************************************************************************* +===================== By Periph team INSA GEI 2022 =========================== +*************************************************************************************/ + +/* +************************************************************************************* +===================== I2C les IO STM32F103 ================================= +************************************************************************************* + +Les IO sont pris en charge par la lib, pas besoin de faire les configurations Alt OD. + +**I2C1** +SCL PB6 +SDA PB7 + +**I2C2** +SCL PB10 +SDA PB11 + + +************************************************************************************* +==================== Fondamentaux I2C ========================================== +************************************************************************************* +- Bus synchrone Low speed (<100kHz) ou high speed (=400kHz), Ici Low speed 100kHz. +- Transfert octet par octet, poids fort en premier, avec aquittement pour chaque octet +- Deux lignes SDA et SCL (horloge) en open drain, repos '1' +- bit "normal" = SDA stable lors du pulse SCL (ie durant l'état haut de SCL, SDA est stable) +- bit Start/Stop/Restart = SDA non stable lorsque SCL vaut '1' (violation règle précédente) + * Start : front descendant de SDA lorsque SCL vaut '1' + * Stop : front montant de SDA lorsque SCL = '1' + * Restart = Start en cours de trame (typiquement pour changer Write/read). +- uC en Mode Master uniquement (c'est notre choix) : c'est le uC qui est maître de l'horloge SCL. +- Le Slave a une @ 7 bits. On ajoute un bit LSB qui est /WR (donc 0 pour écriture, 1 pour lecture) +- Une adresse s'écrit donc |a6 a5 a4 a3 a2 a1 a0 /WR| ce qui donne 8 bits. Elle indique une future +lecture ou écriture. +On parle d'@ 7 bits en regroupant |a6 a5 a4 a3 a2 a1 a0| +On parle d'@ 8 bits en regroupant |a6 a5 a4 a3 a2 a1 a0 /WR| (donc une @ écriture, une @ lecture) +NB : préférer le concept @7bits...c'est plus clair. + +- On peut lire ou écrire une ou plusieurs données à la suite. C'est lors de l'envoie de l'adresse Slave +par le Master que le sens à venir pour les datas est indiqué. +- En écriture, + * les Ack sont faits par le slave après chaque octet envoyé par le master (Ack = mise à 0 le bit 9). +- En lecture, + * dès que le l@ slave est transmise (/RW = 1), et le Ack réalisé, le slave positionne le bit 7 + du prochain octet à lire sur SDA par anticipation , + * le master enchaîne ses pulses (9), lors du pulse 9 (le dernier) c'est le master qui acquite. + * Après chaque acquitement, le Slave amorce le prochain octet en positionnant son bit 7 sur SDA + * Après le dernier octet, le Master génère un stop. + * Pour pouvoir générer le stop, le Master doit piloter SDA, or ce n'est pas possible puisque + le Slave positionne le futur bit 7 ... Pour régler ce problème : + lors du dernier transfert, le Master N'acquitte PAS (NACK). Ainsi le Slave ne + propose plus le bit 7 du prochain octet sur SDA et libère SDA. Le Master peut alors clôturer la + communication avec un Stop. + + + + +======= Echange typique avec un Slave ================================================================ +- Une lecture ou écriture se fait vers un Slave et à partir d'une adresse mémoire donnée (pointeur interne). +Ce pointeur est automatiquement incrémenté dans le slave lors des accès écriture ou lecture. + +- Ecriture de N octets , trame complète (@ = adresse slave, pt = valeur de chargement du pointeur interne) +|Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK| +|pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK| +|d7|d6|d5|d4|d3|d2|d1|d0|Slave ACK| (data 1) +..... +|d7|d6|d5|d4|d3|d2|d1|d0|Salve ACK|Stop Cond| (data N) + +- Lecture de N octets à partir d'une adresse de pointeur donnée +|Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK| +|pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK| +|ReStart Cond |@6|@5|@4|@3|@2|@1|@0| Wr =1 |Slave ACK| (NB: restart nécessaire pour changer écriture / lecture) +|d7|d6|d5|d4|d3|d2|d1|d0|Master ACK| (data 1) +..... +|d7|d6|d5|d4|d3|d2|d1|d0|Master ACK| (data N-1) +|d7|d6|d5|d4|d3|d2|d1|d0|Master NACK|Stop Cond| (data N) + + + + + +************************************************************************************* +==================== La lib I2C ========================================== +************************************************************************************* + +3 fonctions essentielles : +MyI2C_Init +MyI2C_PutString +MyI2C_GetString + +1 fonction spéciale : MyI2C_Get_Error + +Les fonctions Put/Get string fonctionnent sur le principe classique décrit précédemment +(Slave@, Pter @, Data...). +La fonction init prend parmi ses paramètres le nom d'une fct callback d'erreur. +En fait, le driver gère en IT les erreurs possibles I2C. La fonction MyI2C_Get_Error permet de +recevoir un code erreur. +Il est conseillé d'utiliser ce callback. Si on tombe dedans, c'est qu'une erreur s'est produite. +Si le code erreur est "inconnu", souvent c'est qu'il y a un soucis à l'adressage slave: +Vérifier alors la connectique physique SDA/SCL ainsi que l'alimentation du slave ou tout simplement +l'@ slave ! + + +==========================================================================================*/ + + + + + +/*========================================================================================= + GESTION ERREURS +========================================================================================= */ +typedef enum +{ + OK, + BusError, // + AckFail, // Pas,d'ack + TimeOut, // SCL est resté plus de 25ms à l'état bas + UnknownError // IT erreur déclenchée mais pas de flag explicite ... +} MyI2C_Err_Enum; + + + + +/** + * @brief Retourne les erreurs I2C + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval Type d'erreur rencontrée , voir MyI2C_Err_Enum + */ + +MyI2C_Err_Enum MyI2C_Get_Error(I2C_TypeDef * I2Cx); + + + +/*========================================================================================= + INITIALISATION I2C +========================================================================================= */ + + +/** + * @brief Initialise l'interface I2C (1 ou 2) + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param char IT_Prio_I2CErr 0 à 15 (utilisé en cas d'erreur, IT courte et non bloquante + * @param *ITErr_function : callback à utiliser pour sortir d'un plantage transmission + * @retval None + * @Example MyI2C_Init(I2C1, 2,My_CallbackErr); + + + + */ +void MyI2C_Init(I2C_TypeDef * I2Cx, char IT_Prio_I2CErr, void (*ITErr_function) (void)); + + + +/*========================================================================================= + EMISSION I2C : PutString +========================================================================================= */ + + +// Structure de données pour l'émission ou la réception I2C : +typedef struct +{ + char SlaveAdress7bits; // l'adresse I2C du slave device + char * Ptr_Data; // l'adresse du début de tableau char à recevoir/émettre (tableau en RAM uC) + char Nb_Data; // le nbre d'octets à envoyer / recevoir +} +MyI2C_RecSendData_Typedef; + + + +/** + * @brief|Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK| + |pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK| + |d7|d6|d5|d4|d3|d2|d1|d0|Slave ACK| (data 1) + ..... + |d7|d6|d5|d4|d3|d2|d1|d0|Salve ACK|Stop Cond| (data N) + + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param PteurAdress = adresse de démarrage écriture à l'interieur du slave I2C + * @param DataToSend, adresse de la structure qui contient les informations à transmettre + voir définition MyI2C_RecSendData_Typedef + * @retval None + * @Example MyI2C_PutString(I2C1,0xAA, &MyI2C_SendTimeData); + * Ecrit dans le slave câblé sur I2C1 à partir de l'@ mémoire interne Slave 0xAA + + */ +void MyI2C_PutString(I2C_TypeDef * I2Cx, char PteurAdress, MyI2C_RecSendData_Typedef * DataToSend); + + + + + + + + + + +/*========================================================================================= + Réception I2C : GetString +========================================================================================= */ + +/** + * @brief |Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK| + |pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK| + |ReStart Cond |@6|@5|@4|@3|@2|@1|@0| Wr =1 |Slave ACK| + |d7|d6|d5|d4|d3|d2|d1|d0|Master ACK| (data 1) + ..... + |d7|d6|d5|d4|d3|d2|d1|d0|Master NACK|Stop Cond| (data N) + + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param PteurAdress = adresse de démarrage lecture à l'interieur du slave I2C + * @param DataToSend, adresse de la structure qui contient les informations nécessaires à la + réception des données voir définition MyI2C_RecSendData_Typedef + * @retval None + * @Example MyI2C_GetString(I2C1,0xAA, &MyI2C_RecevievedTimeData); + Lit dans le slave câblé sur I2C1 à partir de l'@ mémoire interne Slave 0xAA + */ +void MyI2C_GetString(I2C_TypeDef * I2Cx, char PteurAdress, MyI2C_RecSendData_Typedef * DataToReceive); + + + + +#endif diff --git a/Drivers/Inc/MySPI.h b/Drivers/Inc/MySPI.h new file mode 100644 index 0000000..24ba9a7 --- /dev/null +++ b/Drivers/Inc/MySPI.h @@ -0,0 +1,145 @@ + +#ifndef INC_MYSPI_H_ +#define INC_MYSPI_H_ + +#include "stm32f10x.h" + +#define DATAX0 0x32 +#define DATAX1 0x33 +#define DATAY0 0x34 +#define DATAY1 0x35 +#define DATAZ0 0x36 +#define DATAZ1 0x37 +#define DATA_FORMAT 0x31 +#define BW_RATE 0x2C +#define POWER_CTL 0x2D +#define READ_MB 0xC0 +#define WRITE_MB 0x40 +#define READ 0x80 +#define WRITE 0x00 + + +/************************************************************************************* +===================== By Periph team INSA GEI 2022 =========================== +*************************************************************************************/ + +/* +************************************************************************************* +===================== I2C les IO STM32F103 ================================= +************************************************************************************* +Les IO sont pris en charge par la lib, pas besoin de faire les configurations + + +Sur la Nucléo , le SPI1 est perturbé par la LED2 (PA5), mais doit pouvoir subir les front SCK qd même (LED clignote vite..) +le SPI2 n'est pas utilisable car pin non connectées par défaut (sauf à modifier les SB). En fait la Nucléo fait un choix entre SPI1 +et SPI2 par soudage jumper (SB). + +-> Utiliser SPI1 avec la carte Nucléo + + * **IO SPI 1** + SPI1_NSS PA4 + SPI1_SCK PA5 + SPI1_MISO PA6 + SPI1_MOSI PA7 + + **IO SPI 2** + SPI2_NSS PB12 + SPI2_SCK PB13 + SPI2_MISO PB14 + SPI2_MOSI PB15 + + + + + + +************************************************************************************* +==================== Fondamentaux SPI ========================================== +************************************************************************************* +- Bus Synchrone, 4 fils (même si on peut l'utiliser en 3 fils) +- Transfert à l'octet +- Protocole entre un Master (contrôle SCK) et un Slave +- SCK permet de synchroniser les bits de chaque octet. Il se configure par : + * son niveau de repos : ici niveau '1' + * le front actif de synchronisation pour chaque bit : ici front montant (front up durant bit stable) +- /CS ou /NSS active le slave sur l'état bas +- MOSI : Master Out Slave In (donc data circulant du Master vers le Slave, donc écriture dans le Slave) +- MISO : Master In Slave Out (donc data circulant du Slave vers le Master, donc lecture du Slave) + +Bien que la lib propose une fonction d'écriture et de lecture : + * une écriture s'accompagne obligatoirement d'une lecture (bidon) + * une lecture s'accompagne obligatoirement d'une écriture (bidon) +La gestion /CS = /NSS se fait "à la main". On peut alors lire toute une série d'octets +en laissant /CS à l'état bas pendant toute la durée de circulation des octets. + + +************************************************************************************* +==================== La lib SPI ========================================== +************************************************************************************* + +fonctions essentielles : + +MySPI_Init +MySPI_Send +MySPI_Read +MySPI_Set_NSS +MySPI_Clear_NSS + + +==========================================================================================*/ + + + + +/*========================================================================================= + INITIALISATION SPI +========================================================================================= */ + +/** + * @brief Configure le SPI spécifié : FSCK = 281kHz, Repos SCK = '1', Front actif = up + Gestion /CS logicielle à part, configure les 4 IO + - SCK, MOSI : Out Alt push pull + - MISO : floating input + - /NSS (/CS) : Out push pull + * @param SPI_TypeDef * SPI : SPI1 ou SPI2 + */ +void MySPI_Init(SPI_TypeDef * SPI); + + + +/** + * @brief Envoie un octet (/CS non géré, à faire logiciellement) + Plus en détail, émission de l'octet souhaité sur MOSI + Lecture en même temps d'un octet poubelle sur MISO (non exploité) + * @param : char ByteToSend : l'octet à envoyer + */ +void MySPI_Send(char ByteToSend); + + +/** + * @brief Reçoit un octet (/CS non géré, à faire logiciellement) + Plus en détail, émission d'un octet bidon sur MOSI (0x00) + pour élaborer les 8 fronts sur SCK et donc piloter le slave en lecture + qui répond sur MISO + * @param : none + * @retval : l'octet lu. + */ +char MySPI_Read(void); + + + +/** + * @brief Positionne /CS = /NSS à '1'. A utiliser pour borner les octets à transmettre/recevoir + * @param : none + */ +void MySPI_Set_NSS(void); + + + +/** + * @brief Positionne /CS = /NSS à '0'. A utiliser pour borner les octets à transmettre/recevoir + * @param :none + */ +void MySPI_Clear_NSS(void); + +#endif diff --git a/Drivers/Src/TIMER.c b/Drivers/Src/TIMER.c index b32e923..5b30ccc 100644 --- a/Drivers/Src/TIMER.c +++ b/Drivers/Src/TIMER.c @@ -68,7 +68,7 @@ void MyPWM_Duty (TIM_TypeDef * Timer,char Channel, unsigned short CRR ) if(Channel==1) { - Timer->CCR1=CRR; + Timer->CCR1=CRR; } if(Channel==2) { @@ -77,7 +77,6 @@ void MyPWM_Duty (TIM_TypeDef * Timer,char Channel, unsigned short CRR ) if(Channel==3) { Timer->CCR3=CRR; - } if(Channel==4) { @@ -124,16 +123,10 @@ void init_encoder_timer(void (*IT_function)(void)) //voir page 391 GPIO_PB6.GPIO_Conf = In_Floating; GPIO_PB6.GPIO_Pin = 6; - GPIO_PB7.GPIO = GPIOB; GPIO_PB7.GPIO_Conf = In_Floating; GPIO_PB7.GPIO_Pin = 7; - - /*GPIO_PC3.GPIO = GPIOC; - GPIO_PC3.GPIO_Conf = In_Floating; - GPIO_PC3.GPIO_Pin = 3;*/ - Timer.Timer=TIM4; Timer.ARR = 719; Timer.PSC = 0; @@ -144,10 +137,6 @@ void init_encoder_timer(void (*IT_function)(void)) //voir page 391 MyGPIO_Init (&GPIO_PB7); - //MyGPIO_Init (&GPIO_PC3); - - //MyGPIO_ActiveIT (GPIO_PC3.GPIO, GPIO_PC3.GPIO_Pin, 4, IT_function); - TIM4-> SMCR &= ~0x0007; TIM4-> SMCR |= TIM_SMCR_SMS_1; TIM4-> CCMR1 &= ~0xF2F2; // Mise à 0 des CC1S, CC2S, IC1F et IC2F @@ -156,7 +145,6 @@ void init_encoder_timer(void (*IT_function)(void)) //voir page 391 TIM4-> CCER &= TIM_CCER_CC1P; TIM4-> CCER &= TIM_CCER_CC2P; TIM4-> CR1 |= TIM_CR1_CEN; - } void Reset_degree (void) @@ -184,7 +172,7 @@ void TIM3_IRQHandler (void) { (*tim_ptr3_func)(); } - TIM3->SR &= ~(1<<0) ; + TIM3->SR &= ~(1<<0); } void TIM4_IRQHandler (void) @@ -202,5 +190,5 @@ void TIM1_UP_IRQHandler (void) { (*tim_ptr1_func)(); } - TIM1->SR &= ~(1<<0) ; + TIM1->SR &= ~(1<<0); } diff --git a/Drivers/Src/UART.c b/Drivers/Src/UART.c index d844831..f136941 100644 --- a/Drivers/Src/UART.c +++ b/Drivers/Src/UART.c @@ -33,6 +33,7 @@ void UART_send(char data) { while(!(USART1->SR & USART_SR_TXE)) // Tant que le buffer d'envoi n'est pas vide, on n'envoie pas plus de données { + } USART1->DR = data; // Ecriture de la donnée dans le registre DR } @@ -49,7 +50,7 @@ void USART1_IRQHandler() { if (USART1->SR & USART_SR_RXNE) { - USART1->SR &= ~USART_SR_RXNE; // On abaisse le flag d'interruption + //USART1->SR &= ~USART_SR_RXNE; // On abaisse le flag d'interruption if(uart_rx_ptr_func!=0) { (*uart_rx_ptr_func)(); diff --git a/Projet_DevDrivers/Sources/Principal.c b/Projet_DevDrivers/Sources/Principal.c deleted file mode 100644 index 2905c75..0000000 --- a/Projet_DevDrivers/Sources/Principal.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "stm32f10x.h" -#include "GPIO.h" -#include "TIMER.h" - - - -void MyFunction_IT (void); -MyGPIO_Struct_TypeDef PA5; -MyGPIO_Struct_TypeDef PA6; -MyGPIO_Struct_TypeDef PC13; -MyTimer_Struct_TypeDef timer3; -//PA5 LED -//PC13 Bouton - -int main ( void ) -{ - PA5.GPIO=GPIOA; - PA5.GPIO_Conf=Out_Ppull; - PA5.GPIO_Pin=5; - MyGPIO_Init(&PA5); - PA6.GPIO=GPIOA; - PA6.GPIO_Conf=AltOut_Ppull; - PA6.GPIO_Pin=6; - MyGPIO_Init(&PA6); - - timer3.Timer=TIM3; - timer3.ARR=35999; //pour avoir 500ms - timer3.PSC=1000; - MyTimer_Base_Init(&timer3); - MyTimer_ActiveIT(timer3.Timer,1, &MyFunction_IT); - MyTimer_Base_Start(timer3.Timer); - - MyPWM_init (TIM3,1); - MyPWM_Duty (TIM3,1, 10000); - - - while(1) - { - - } - -} - - - -void MyFunction_IT (void) -{ - MyGPIO_Toggle(PA5.GPIO,5); -} diff --git a/Projet_voile/Includes/CAP_voilier.h b/Projet_voile/Includes/CAP_voilier.h new file mode 100644 index 0000000..06caf0b --- /dev/null +++ b/Projet_voile/Includes/CAP_voilier.h @@ -0,0 +1,11 @@ +#ifndef CAP_voilier_H +#define CAP_voilier_H + +#include "UART.h" +#include "TIMER.h" +#include "GPIO.h" + +void My_cap_init(void); +void Madirection_IT (void); + +#endif diff --git a/Projet_voile/Includes/Pwm_voile.h b/Projet_voile/Includes/Pwm_voile.h index 9c11f51..97036ff 100644 --- a/Projet_voile/Includes/Pwm_voile.h +++ b/Projet_voile/Includes/Pwm_voile.h @@ -3,6 +3,7 @@ #include "stm32f10x.h" #include "GPIO.h" #include "TIMER.h" +#include "Rouli.h" void init_pwm_voile(void); diff --git a/Projet_voile/Includes/Rouli.h b/Projet_voile/Includes/Rouli.h new file mode 100644 index 0000000..aa44f93 --- /dev/null +++ b/Projet_voile/Includes/Rouli.h @@ -0,0 +1,23 @@ +#ifndef ROULI_H +#define ROULI_H + +#include "stm32f10x.h" +#include "GPIO.h" +#include "TIMER.h" +#include "MySPI.h" + +typedef struct +{ + float gX; + float gY; + float gZ; + +}XYZ; + +void rouli_InitAccel(void); + +void rouli_GetAccel (XYZ * axe); + +void rouli_IT_Bascule(void); + +#endif diff --git a/Projet_voile/Sources/CAP_voilier.c b/Projet_voile/Sources/CAP_voilier.c new file mode 100644 index 0000000..d973c20 --- /dev/null +++ b/Projet_voile/Sources/CAP_voilier.c @@ -0,0 +1,52 @@ +#include "CAP_voilier.h" + +MyTimer_Struct_TypeDef timer1; +void Madirection_IT (void); +signed char direction ; +int duty_cap ; +MyGPIO_Struct_TypeDef PA8; +MyGPIO_Struct_TypeDef PB1; +char valeur =0; +extern char MyChar; + + +void My_cap_init(void) +{ + PA8.GPIO=GPIOA; + PA8.GPIO_Conf=AltOut_Ppull; + PA8.GPIO_Pin=8; + MyGPIO_Init(&PA8); + + PB1.GPIO=GPIOB; + PB1.GPIO_Conf=Out_Ppull; + PB1.GPIO_Pin=1; + MyGPIO_Init(&PB1); + + timer1.Timer=TIM1; + timer1.ARR=100; //pour avoir 20Khz et un PWM a 100 positions + timer1.PSC=36; + MyTimer_Base_Init(&timer1); + MyTimer_Base_Start(timer1.Timer); + MyPWM_init(timer1.Timer,1); + MyUART_init(); + + MyUART_ActiveIT(1,&Madirection_IT); + +} + +void Madirection_IT (void) +{ + direction = UART_receive(); + if( direction <0 ) + { + MyGPIO_Set(GPIOB,1); + valeur =-direction; + } + else + { + MyGPIO_Reset(GPIOB,1); + valeur = direction; + } + duty_cap=valeur; + MyPWM_Duty(timer1.Timer,1, duty_cap ); +} diff --git a/Projet_voile/Sources/Principal.c b/Projet_voile/Sources/Principal.c index a9d5778..dbb2f07 100644 --- a/Projet_voile/Sources/Principal.c +++ b/Projet_voile/Sources/Principal.c @@ -6,16 +6,24 @@ #include "TIMER.h" #include "Girouette.h" #include "Pwm_voile.h" +#include "MyI2C.h" +#include "MySPI.h" +#include "CAP_voilier.h" char MyChar; +char X0,X1,Y0,Y1,Z0,Z1; +char read_DATA,read_BWR,read_PWRC; +int16_t gX,gY,gZ; +int test =0; + //MyGPIO_Struct_TypeDef PA5; //PA5 LED //MyGPIO_Struct_TypeDef PC13; //PC13 Bouton -void UART_RX_IT (void) -{ - MyChar=UART_receive(); -} +//void UART_RX_IT (void) +//{ +// MyChar=UART_receive(); +//} int main ( void ) { @@ -27,13 +35,24 @@ int main ( void ) init_girouette(); init_pwm_voile(); + MySPI_Init(SPI1); + rouli_InitAccel(); + My_cap_init(); - MyUART_init(); - MyUART_ActiveIT(1, &UART_RX_IT); //mode permet d'activer soit l'interruption sur TX + MySPI_Send(READ|DATA_FORMAT); + read_DATA = MySPI_Read(); + MySPI_Send(READ|BW_RATE); + read_BWR = MySPI_Read(); + MySPI_Send(READ|POWER_CTL); + read_PWRC = MySPI_Read(); + +// MyUART_init(); +// MyUART_ActiveIT(1, &UART_RX_IT); //mode permet d'activer soit l'interruption sur TX + while(1) { Test_tour_girouette(); - //Orientation_voiles(); + } } diff --git a/Projet_voile/Sources/Pwm_voile.c b/Projet_voile/Sources/Pwm_voile.c index f64d48e..aaac871 100644 --- a/Projet_voile/Sources/Pwm_voile.c +++ b/Projet_voile/Sources/Pwm_voile.c @@ -2,30 +2,39 @@ MyTimer_Struct_TypeDef Timer2, Timer3; MyGPIO_Struct_TypeDef PB0; +XYZ mesures; void write_pwm(void) { int val_pwm; float cnt; - cnt=Read_CNT(); - if(cnt>=360) + rouli_GetAccel(&mesures); + if((mesures.gY <= (-0.7)) || (mesures.gY >= 0.7)) { - cnt=cnt-360; - val_pwm=(Timer3.ARR/20)+((Timer3.ARR/20)*(cnt/360.0)); + val_pwm = 720;//0.985ms } else { - val_pwm=2*(Timer3.ARR/20)-((Timer3.ARR/20)*(cnt/360.0)); + cnt=Read_CNT(); + if(cnt>=360) + { + cnt=cnt-360; + val_pwm=(Timer3.ARR/20)+((Timer3.ARR/20)*(cnt/360.0)); + } + else + { + val_pwm=2*(Timer3.ARR/20)-((Timer3.ARR/20)*(cnt/360.0)); + } } - //Timer3.ARR/20 --> 1ms, pour controler le moteur c'est entre 1ms et 2ms - //calcul angle en pwm + MyPWM_Duty(Timer3.Timer,3,val_pwm); + } void init_pwm_voile(void) { Timer2.Timer=TIM2; - Timer2.ARR=1800; + Timer2.ARR=18000; Timer2.PSC=1000; MyTimer_Base_Init(&Timer2); MyTimer_ActiveIT(Timer2.Timer,2,&write_pwm); @@ -42,3 +51,4 @@ void init_pwm_voile(void) MyTimer_Base_Start(Timer3.Timer); } + diff --git a/Projet_voile/Sources/Rouli.c b/Projet_voile/Sources/Rouli.c new file mode 100644 index 0000000..71cd7cc --- /dev/null +++ b/Projet_voile/Sources/Rouli.c @@ -0,0 +1,43 @@ +#include "Rouli.h" + + + +/* Dans cette partie nous allons traiter le roulis du voiluier */ + +void rouli_InitAccel(void) +{ + MySPI_Clear_NSS(); + /* Init de l'accelerometre avec SPI */ + MySPI_Send(WRITE|DATA_FORMAT); /* Ecriture dans le data Format */ + MySPI_Send(0x0B); /* Envoi des param�tres */ + MySPI_Send(WRITE|BW_RATE); /* Ecriture dans le BW rate */ + MySPI_Send(0x0A); /* Envoi des param�tres */ + MySPI_Send(WRITE|POWER_CTL); /* Ecriture dans le POWER_CTL */ + MySPI_Send(0x08); /* Envoi des param�tre */ + MySPI_Set_NSS(); +} + + +void rouli_GetAccel (XYZ * axe) +{ + char X0,X1,Y0,Y1,Z0,Z1; + + MySPI_Clear_NSS(); + + MySPI_Send(READ_MB|DATAX0); + + X0 = MySPI_Read () ; + X1 = MySPI_Read () ; + Y0 = MySPI_Read () ; + Y1 = MySPI_Read () ; + Z0 = MySPI_Read () ; + Z1 = MySPI_Read () ; + MySPI_Set_NSS(); + + axe->gX = ((short int)((X1<<8)|X0))*0.004; + axe->gY = ((short int)((Y1<<8)|Y0))*0.004; + axe->gZ = ((short int)((Z1<<8)|Z0))*0.004; +} + +// axe y entre -0.7 et 0.7 + diff --git a/Projet_voile/TP1.uvoptx b/Projet_voile/TP1.uvoptx index 1d9f429..294d18c 100644 --- a/Projet_voile/TP1.uvoptx +++ b/Projet_voile/TP1.uvoptx @@ -125,7 +125,7 @@ 0 DLGDARM - (1010=710,304,1086,861,1)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=1161,471,1582,898,1)(121=-1,-1,-1,-1,0)(122=1317,323,1738,750,0)(123=-1,-1,-1,-1,0)(140=1117,100,1805,440,1)(240=263,238,662,583,1)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) + (1010=710,304,1086,861,1)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=1161,471,1582,898,1)(121=1064,158,1485,585,1)(122=1317,323,1738,750,0)(123=-1,-1,-1,-1,0)(140=1117,100,1805,440,1)(240=263,238,662,583,1)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=150,186,744,937,1)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) 0 @@ -144,7 +144,7 @@ 0 90 1 -
134218190
+
134219870
0 0 0 @@ -160,7 +160,7 @@ 0 100 1 -
134218154
+
134219834
0 0 0 @@ -180,7 +180,7 @@ 1 1 0 - 1 + 0 0 0 1 @@ -192,7 +192,7 @@ 0 0 0 - 1 + 0 0 0 0 @@ -328,7 +328,7 @@ 0 DLGTARM - (1010=457,337,833,894,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=1002,18,1423,423,0)(121=235,274,656,679,1)(122=353,663,774,1068,0)(123=-1,-1,-1,-1,0)(140=1031,78,1719,418,0)(240=1050,425,1449,770,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=377,147,971,841,1)(133=139,242,733,936,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) + (1010=457,337,833,894,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=919,465,1340,870,0)(121=996,383,1417,788,0)(122=353,663,774,1068,0)(123=-1,-1,-1,-1,0)(140=1031,78,1719,418,0)(240=1050,425,1449,770,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=1066,271,1660,965,0)(131=-1,-1,-1,-1,0)(132=854,318,1448,1012,0)(133=139,242,733,936,0)(160=914,540,1362,954,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) 0 @@ -358,6 +358,16 @@ 1 cnt,0x0A + + 1 + 1 + MyChar + + + 2 + 1 + direction + 0 @@ -379,7 +389,7 @@ 0 0 0 - 1 + 0 0 0 0 @@ -401,12 +411,6 @@ - - - System Viewer\TIM4 - 35905 - - 1 0 @@ -439,7 +443,7 @@ 1 2 1 - 1 + 0 0 0 .\Sources\Girouette.c @@ -451,7 +455,7 @@ 1 3 1 - 1 + 0 0 0 ..\DRIVERS\Src\GPIO.c @@ -463,7 +467,7 @@ 1 4 1 - 1 + 0 0 0 ..\Drivers\Src\TIMER.c @@ -499,7 +503,7 @@ 1 7 1 - 1 + 0 0 0 .\Sources\Pwm_voile.c @@ -507,6 +511,42 @@ 0 0 + + 1 + 8 + 1 + 0 + 0 + 0 + .\Sources\Rouli.c + Rouli.c + 0 + 0 + + + 1 + 9 + 1 + 1 + 0 + 0 + .\Sources\CAP_voilier.c + CAP_voilier.c + 0 + 0 + + + 1 + 10 + 4 + 0 + 0 + 0 + ..\Drivers\Inc\Lib_Com_Periph_2022.lib + Lib_Com_Periph_2022.lib + 0 + 0 + diff --git a/Projet_voile/TP1.uvprojx b/Projet_voile/TP1.uvprojx index 316cb0f..10772f1 100644 --- a/Projet_voile/TP1.uvprojx +++ b/Projet_voile/TP1.uvprojx @@ -16,7 +16,7 @@ STM32F103RB STMicroelectronics - Keil.STM32F1xx_DFP.2.4.0 + Keil.STM32F1xx_DFP.2.3.0 http://www.keil.com/pack/ IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -186,7 +186,6 @@ 0 0 0 - 0 0 0 8 @@ -419,6 +418,21 @@ 1 .\Sources\Pwm_voile.c + + Rouli.c + 1 + .\Sources\Rouli.c + + + CAP_voilier.c + 1 + .\Sources\CAP_voilier.c + + + Lib_Com_Periph_2022.lib + 4 + ..\Drivers\Inc\Lib_Com_Periph_2022.lib + @@ -439,7 +453,7 @@ STM32F103RB STMicroelectronics - Keil.STM32F1xx_DFP.2.4.0 + Keil.STM32F1xx_DFP.2.3.0 http://www.keil.com/pack/ IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -609,7 +623,6 @@ 0 0 0 - 0 0 0 8 @@ -763,7 +776,7 @@ - .\Includes;..\DRIVERS\Inc + .\Includes;..\Drivers\Inc @@ -842,6 +855,40 @@ 1 .\Sources\Pwm_voile.c + + Rouli.c + 1 + .\Sources\Rouli.c + + + CAP_voilier.c + 1 + .\Sources\CAP_voilier.c + + + Lib_Com_Periph_2022.lib + 4 + ..\Drivers\Inc\Lib_Com_Periph_2022.lib + + + 2 + 0 + 0 + 0 + 0 + 1 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + @@ -876,7 +923,7 @@ RTE\Device\STM32F103RB\RTE_Device.h - + @@ -885,7 +932,7 @@ RTE\Device\STM32F103RB\startup_stm32f10x_md.s - + @@ -894,7 +941,7 @@ RTE\Device\STM32F103RB\system_stm32f10x.c - + diff --git a/README.md b/README.md index bedb766..b5e9b80 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,10 @@ Le projet se sépare en 2 grandes parties : Pour cela, nous avons utilisé les 3 documentations disponibles dans la première section de ce [cours moodle](https://moodle.insa-toulouse.fr/course/view.php?id=79#section-1). Nous avons donc réalisé les drivers suivant : -[x] l'[ADC](Drivers/Inc/ADC.h) -[x] les [GPIOs](Drivers/Inc/GPIO.h) -[x] l'[UART](Drivers/Inc/UART.h) -[x] les [Timers et le PWM](Drivers/Inc/TIMER.h) +- [x] l'[ADC](Drivers/Inc/ADC.h) +- [x] les [GPIOs](Drivers/Inc/GPIO.h) +- [x] l'[UART](Drivers/Inc/UART.h) +- [x] les [Timers et le PWM](Drivers/Inc/TIMER.h) Les drivers pour l'utilisation du SPI et de l'I2C nous sont fournis. @@ -29,13 +29,13 @@ Les drivers pour l'utilisation du SPI et de l'I2C nous sont fournis. Pour cela nous avons utilisé les documentations disponible dans la [section suivante](https://moodle.insa-toulouse.fr/course/view.php?id=79#section-16) du cours moodle précédemment cité. Nous avons donc réalisé les fonctions suivantes : -[x] la [Girouette](Projet_voile/Includes/Girouette.h) -[ ] l' [Horloge](Drivers/Inc/Horloge.h) -[ ] l'[IMU](Drivers/Inc/IMU.h) -[x] le [Moteur des voiles](Drivers/Inc/Moteur_voile.h) -[ ] le [Moteur du plateau](Drivers/Inc/Moteur_plateau.h) -[ ] la [Mesure de tension de la batterie](Drivers/Inc/Mesure_tension.h) -[ ] la [télécommande](Drivers/Inc/Telecommande.h) +- [x] la [Girouette](Projet_voile/Includes/Girouette.h) +- [ ] l' [Horloge](Drivers/Inc/Horloge.h) +- [x] l'[IMU](Drivers/Inc/IMU.h) +- [x] le [Moteur des voiles](Drivers/Inc/Moteur_voile.h) +- [x] le [Moteur du plateau](Drivers/Inc/Moteur_plateau.h) +- [ ] la [Mesure de tension de la batterie](Drivers/Inc/Mesure_tension.h) +- [x] la [télécommande](Drivers/Inc/Telecommande.h) Evidemment chacune de ces fonctions font appel aux drivers de la couche en dessous.