.
Dependencies: L432KC_SPI_Pey_Lal
main.cpp
- Committer:
- voltxd
- Date:
- 2022-05-17
- Revision:
- 113:2f8f255e99f2
- Parent:
- 112:478ae92cb106
- Child:
- 114:c1f7be27aa5d
File content as of revision 113:2f8f255e99f2:
/* mbed Microcontroller Library * Copyright (c) 2019 ARM Limited * SPDX-License-Identifier: Apache-2.0 */ #include "mbed.h" #include "platform/mbed_thread.h" #include "protocol.h" #include "asservissement.hpp" //Define PWM #define PWM_PROP D9 #define PWM_DIR D10 //Define interrupt Input #define SPEED_CAPTOR A4 //Define COEF #define DISTANCE_FOR_HALF_TURN 3 * 3.14 //TODO: mettre vrai valeur #define CONTROL_RATE 1000.0 //fontion interrupt void onRxInterrupt(); void onSpeedCaptorInterrupt(); void onTickerAsservissementInterrupt(); //Declaration PWM outputs PwmOut propulsion(PWM_PROP); PwmOut direction(PWM_DIR); //Declaration analog input InterruptIn speedCaptor(SPEED_CAPTOR); //Declaration Links static UnbufferedSerial serial_port(USBTX, USBRX,115200); //Timers Timer tSpeed; Timer tTerminalWriting; Ticker tickAsserv; //Var. double currentSpeed = 0; double commandSpeed = 5; //Declaration PWM variables uint32_t pulsewidth_direction = 1100; uint32_t pulsewidth_propulsion = 1500; int main() { //Test Serial port serial_port.write("Test\n\r",strlen("Test\n\r")); char terminalOutput[256]; //Interrupt serial_port.attach(&onRxInterrupt, SerialBase::RxIrq); speedCaptor.fall(&onSpeedCaptorInterrupt); tickAsserv.attach(&onTickerAsservissementInterrupt, 1.0 / CONTROL_RATE); //Init. propulsion PWM propulsion.period_us(20000); propulsion.pulsewidth_us(pulsewidth_propulsion); thread_sleep_for(2000); //Init. Direction PWM direction.period_us(20000); direction.pulsewidth_us(pulsewidth_direction); //Timers init. tSpeed.start(); tTerminalWriting.start(); //Infinite loop while(1) { //If decoding has ended, get and changes PWM values. if(isDataAvailable()) { getVerifiedPWMValues(&pulsewidth_propulsion, &pulsewidth_direction); propulsion.pulsewidth_us(pulsewidth_propulsion); direction.pulsewidth_us(pulsewidth_direction); } //If no speed captor interrupt, consider speed = 0 if (tSpeed.read() > 0.25) { currentSpeed = 0; tSpeed.reset(); } //Write in terminal if (tTerminalWriting.read() > 0.1) { sprintf(terminalOutput, "Vcons = %d, Vmes = %d, PWM = %d\r", (int)commandSpeed, (int)currentSpeed, pulsewidth_propulsion); serial_port.write(terminalOutput, strlen(terminalOutput)); tTerminalWriting.reset(); } } } void onRxInterrupt() { char c; // Read the data to clear the receive interrupt. if (serial_port.read(&c, 1)) { decodeMessage(c); //serial_port.write(&c, 1); } } void onSpeedCaptorInterrupt() { //Measure car speed double currentSpeedPeriod = tSpeed.read(); currentSpeed = DISTANCE_FOR_HALF_TURN / currentSpeedPeriod; tSpeed.reset(); } void onTickerAsservissementInterrupt() { //Command car's speed pulsewidth_propulsion = PID(commandSpeed - currentSpeed, CONTROL_RATE); propulsion.pulsewidth_us(pulsewidth_propulsion); }