diff --git a/Drivers/Inc/Lib_Com_Periph_2022.lib b/Drivers/Inc/Lib_Com_Periph_2022.lib
new file mode 100644
index 0000000..ce805ab
Binary files /dev/null and b/Drivers/Inc/Lib_Com_Periph_2022.lib differ
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.