Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed PROGRAMME_MOTEUR_V1
Diff: main.cpp
- Revision:
- 2:ce23bd78a43a
- Parent:
- 1:b71ac293907d
diff -r b71ac293907d -r ce23bd78a43a main.cpp
--- a/main.cpp Thu Apr 08 14:32:30 2021 +0000
+++ b/main.cpp Thu Apr 15 14:53:13 2021 +0000
@@ -1,16 +1,18 @@
// Display changes in encoder position and direction
#include "mbed.h"
#include "qeihw.h"
-#define PLAGE_ANGULAIRE 420
-#define GAUCHE_MAX 710
+#define PLAGE_ANGULAIRE 800 // 800 // 420
+#define GAUCHE_MAX 500 // 500 /// 720
+#define TOUT_DROIT 900
+#define ARRET_MOTEUR_NON_VOULU 3
#define BLINKING_RATE_MS
#define CAPTEUR_TEMPO 200
#define CAN_TEMPO 50
#define MOTEUR_TEMPO 50
#include "mbed.h"
#define POS_PER_METER 43636
-#define GAUCHE_MAX 710
-#define PLAGE_ANGULAIRE 420
+//#define GAUCHE_MAX 710
+//#define PLAGE_ANGULAIRE 420
CAN can2(p30, p29,1000000);
@@ -22,12 +24,18 @@
DigitalOut led1(LED1);
DigitalOut led3(LED3);
+void print (void);
+
+void serial_ISR(void);
+
int Bytes2Int(char data[], int position ) ;
void set_position(unsigned short us) ;
void send_can (float vitesse, int nbr) ;
+void send_can2(bool Moteur_stopper);
+
float Bytes2Float( char data[], int position) ;
float Float2Bytes( char data[], float nbr) ;
@@ -37,17 +45,23 @@
Timer can_timer ;
Timer mot_timer ;
Timer capteur_timer ;
+Timer Probleme_arret;
+
+unsigned short pos = 1000;
+float vit = 0 ;
+
int main() {
- int32_t Position2, position = 0 , temp = 0;
+ int32_t Position2, position = 0 , temp = 0, premier_probleme = 0;
float vitesse = 1.05 , direction , ValMot, ValServo ;
unsigned char *chptr;
- char Sens = 1;
+ char Sens = 1, Moteur_stopper = 0;
+ int ajustement_direction = 0;
CANMessage msg_rx;
CANMessage msg_tx;
-
+ usb.attach(&serial_ISR,Serial::RxIrq);
qei.SetDigiFilter(10);
@@ -55,17 +69,26 @@
mot_timer.start() ;
can_timer.start() ;
+ Probleme_arret.start();
capteur_timer.start() ;
tempo.start() ;
Servo.period_ms(20);
- pwm_mot.period_ms(20);
+ pwm_mot.period_us(50);
+ inA = 1;
+ inB = 0;
while(1)
{
if (can2.read(msg_rx))
{
- ValServo = (float)msg_rx.data[0]/255.0f* PLAGE_ANGULAIRE + GAUCHE_MAX;;
+ ValServo = (float)msg_rx.data[0]/255.0f* PLAGE_ANGULAIRE + GAUCHE_MAX;
+ if(ValServo>=TOUT_DROIT)
+ {
+ ajustement_direction = (ValServo - TOUT_DROIT)*0.33;
+ ValServo = ValServo - ajustement_direction;
+ }
+
ValMot = float(msg_rx.data[1]/255.0f);
Sens = msg_rx.data[2] ;
inA = Sens;
@@ -86,16 +109,30 @@
set_position(ValServo);
pwm_mot.write(ValMot);
-
+ //set_position(pos);
+ //pwm_mot.write(vit);
- if(can_timer.read_ms() > CAN_TEMPO ){
-
+ if(can_timer.read_ms() > CAN_TEMPO )
+ {
+ if (vitesse <= ARRET_MOTEUR_NON_VOULU)
+ {
+ if(premier_probleme == 0)
+ premier_probleme = Probleme_arret.read_ms();
+ if(Probleme_arret.read_ms() >= premier_probleme + 5000);
+ Moteur_stopper = 1;
+ if(vitesse >= ARRET_MOTEUR_NON_VOULU)
+ {
+ Moteur_stopper = 0;
+ premier_probleme = 0;
+ }
+ }
send_can(vitesse, position) ;
+ send_can2(Moteur_stopper);
can_timer.reset() ;
- }
+ }
@@ -134,6 +171,7 @@
message.data[5] = char(nbr>>8) ;
message.data[6] = char(nbr>>16) ;
message.data[7] = char(nbr>>24) ;
+
message.id=0x400;
res = Bytes2Float((char*)message.data, 0) ;
@@ -144,15 +182,28 @@
can2.write(message);
}
-
-
+void send_can2(bool Moteur_stopper)
+{
+ CANMessage message2;
+ message2.len=1;
+ message2.data[0] = bool(Moteur_stopper);
+
+ message2.id=0x500;
+
+ usb.printf("\rARRET MOTEUR %d",Moteur_stopper);
+
+ message2.type=CANData;
+ message2.format=CANStandard;
+ can2.write(message2);
+
+}
void set_position(unsigned short us)
{
unsigned short period= us+20000;
float pulse_width;
- if (tempo.read_ms()> 50)
+ if (tempo.read_ms() > 50)
{
pulse_width=((float)us)/((float)period);
Servo.period_us(period);
@@ -185,3 +236,42 @@
memcpy(u.bytes, data + position,4) ;
return u.float_sent ;
}
+
+void serial_ISR(void){
+ char msg=usb.getc();
+ switch (msg){
+ case 'a':
+ pos=pos+100;
+ break;
+ case 'z':
+ if (pos>100)
+ pos=pos-100;
+ break;
+ case 'e':
+ pos=pos+10;
+ break;
+ case 'r':
+ if (pos>10)
+ pos=pos-10;
+ break;
+ case 'q':
+ if (vit<1.0)
+ vit+=0.1 ;
+ break;
+ case 's':
+ if (vit>0.0)
+ vit-= 0.1 ;
+ break;
+ case 'd':
+ if (vit<1.0)
+ vit+=0.01 ;
+ break;
+ case 'f':
+ if (vit>0.0)
+ vit-=0.01 ;
+ break;
+
+
+ }
+ usb.printf("pos = %d us vit = %f \n",pos,vit);
+}