Official library for the FRDM-TFC shield

Dependents:   TFC-TEST TFC-RACING-DEMO TFC-RACING-DEMO TFC-RACING-FSLMENTORMATTERS ... more

Overview

This library is an example driver for the FRDM-TFC shield that can be used for with MBED compiler. Documentation for the hardware can be found here

https://community.freescale.com/docs/DOC-93914

Note that the current videos on that page pertain to the codewarrior example projects hosted on google code, not the library presented here. While the code is very similiar, there are some differences. New videos will be posted for the MBED libraries as the code bases will eventually merge

Also note that this is just the raw library. The example program that uses the code is here:

http://mbed.org/users/redxeth/code/TFC-TEST/

IMPORTANT

There is a bug with firmware "mbed_if_v2.0_frdm_kl25Z ". It seems to hold the I/O pin PORTC1 (FTM0 - Channel 0 on J10 Pin 12) high. This prevents the PWM signal for one of the motor drivers from working correctly.

Page 4 of the FRDM-LK25Z board shows the OpenSDA connected to this net via resistor R24. Remove this resistor on your freedom board.

This was verified to be in the SDA firmware as the debug firmware used for Codewarrior use (DEBUG-APP_Pemicro_v102.SDA) does not have this issue.

Example Main.cpp

#include "mbed.h"
#include "TFC.h"

 
//This macro is to maintain compatibility with Codewarrior version of the sample.   This version uses the MBED libraries for serial port access
Serial PC(USBTX,USBRX);

#define TERMINAL_PRINTF     PC.printf

 
 //This ticker code is used to maintain compability with the Codewarrior version of the sample.   This code uses an MBED Ticker for background timing.
 
#define NUM_TFC_TICKERS 4

Ticker TFC_TickerObj;
 
volatile uint32_t TFC_Ticker[NUM_TFC_TICKERS];
 
void TFC_TickerUpdate()
{
    int i;
 
    for(i=0; i<NUM_TFC_TICKERS; i++)
     {
        if(TFC_Ticker[i]<0xFFFFFFFF) 
        {
            TFC_Ticker[i]++;
        }
    }
}
 
 
int main()
{
    uint32_t i,t = 0;
  
    PC.baud(115200);
    TFC_TickerObj.attach_us(&TFC_TickerUpdate,2000);
   
    TFC_Init();
    
    for(;;)
    {      
        //TFC_Task must be called in your main loop.  This keeps certain processing happy (I.E. Serial port queue check)
         //   TFC_Task();

            //This Demo program will look at the middle 2 switch to select one of 4 demo modes.
            //Let's look at the middle 2 switches
            switch((TFC_GetDIP_Switch()>>1)&0x03)
            {
            default:
            case 0 :
                //Demo mode 0 just tests the switches and LED's
                if(TFC_PUSH_BUTTON_0_PRESSED)
                    TFC_BAT_LED0_ON;
                else
                    TFC_BAT_LED0_OFF;
                
                if(TFC_PUSH_BUTTON_1_PRESSED)
                    TFC_BAT_LED3_ON;
                else
                    TFC_BAT_LED3_OFF;
                
                
                if(TFC_GetDIP_Switch()&0x01)
                    TFC_BAT_LED1_ON;
                else
                    TFC_BAT_LED1_OFF;
                
                if(TFC_GetDIP_Switch()&0x08)
                    TFC_BAT_LED2_ON;
                else
                    TFC_BAT_LED2_OFF;
                
                break;
                    
            case 1:
                
                //Demo mode 1 will just move the servos with the on-board potentiometers
                if(TFC_Ticker[0]>=20)
                {
                    TFC_Ticker[0] = 0; //reset the Ticker
                    //Every 20 mSeconds, update the Servos
                    TFC_SetServo(0,TFC_ReadPot(0));
                    TFC_SetServo(1,TFC_ReadPot(1));
                }
                //Let's put a pattern on the LEDs
                if(TFC_Ticker[1] >= 125)
                {
                    TFC_Ticker[1] = 0;
                    t++;
                    if(t>4)
                    {
                        t=0;
                    }           
                    TFC_SetBatteryLED_Level(t);
                }
                
                TFC_SetMotorPWM(0,0); //Make sure motors are off
                TFC_HBRIDGE_DISABLE;
            

                break;
                
            case 2 :
                
                //Demo Mode 2 will use the Pots to make the motors move
                TFC_HBRIDGE_ENABLE;
               
                TFC_SetMotorPWM(TFC_ReadPot(0),TFC_ReadPot(1));
                
                        
                //Let's put a pattern on the LEDs
                if(TFC_Ticker[1] >= 125)
                    {
                        TFC_Ticker[1] = 0;
                            t++;
                            if(t>4)
                            {
                                t=0;
                            }           
                        TFC_SetBatteryLED_Level(t);
                    }
                break;
            
            case 3 :
            
         
                //Demo Mode 3 will be in Freescale Garage Mode.  It will beam data from the Camera to the 
                //Labview Application
                
                
                if(TFC_Ticker[0]>50 && TFC_LineScanImageReady>0)
                    {
                     TFC_Ticker[0] = 0;
                     TFC_LineScanImageReady=0;
                     TERMINAL_PRINTF("\r\n");
                     TERMINAL_PRINTF("L:");
                     
                        if(t==0)
                            t=4;
                        else
                            t--;
                        
                         TFC_SetBatteryLED_Level(t);
                        
                         // camera 1
                         for(i=0;i<128;i++)
                         {
                               TERMINAL_PRINTF("%X,",TFC_LineScanImage0[i]);
                         }
                        
                        // camera 2
                         for(i=0;i<128;i++)
                         {
                                 if(i==127)
                                     TERMINAL_PRINTF("%X\r\n",TFC_LineScanImage1[i]);
                                 else
                                     TERMINAL_PRINTF("%X,",TFC_LineScanImage1[i]);
                           
                         }
                    }
                 
                break;
            }
    }
    
 
}

Implementation Notes

The goal of the this library was to provide an easy to use API for the FRDM-TFC hardware that would give one a good start in getting a car working. There are only a couple of function calls needed to make the components on the care work. The library is implemented as a standard C API. While most of the MBED code is provided as a C++, the decision to use a C only API was done for the following reasons:

  • Some of the advantages of a C++ class really don't apply in this case. Since there would only be a single instance of the class library, there is no reason to wrap the functions in a class.
  • The library tightly integrated to synchronized different components in the interrupts routines. I.E. Camera acquisition is synced to the servo period. To accomplished this we had to write the code in raw C and write our own interrupt routines. Tieing these to a c++ class really didn't make sense.
  • Since many users also use an "offline" compiler, (I.E. Codewarrior) it was a design requirement that the the same code/API could be easy moved to the Codewarrior environment.
  • Even though the MBED libraries provide classes for PWM that could be used for the servos and drive motor controller, we had to write our own code for the internal TPM units as we needed some special features (Different switching frequency on certain channels) that could not be accomplished with the libraries. This is transparent to the end user.

The library uses a number of of resources on the Freedom board. The list below show what the library uses. The user should not use the MBED libraries to talk to those ports/peripherals.

I/O: -

  • PTB0 (Servo Channel 0 - TPM1)
  • PTB1 (Servo Channel 1 - TPM1)
  • PTB8 (Battery LED0)
  • PTB9 (Battery LED1)
  • PTB10 (Battery LED2)
  • PTB11 (Battery LED3)
  • PTD7 (Camera SI)
  • PTE0 (Camera CLK)
  • PTD5 (Camera A0 - ADC_SE6b)
  • PTD6 (Camera A1 - ADC_SE7b)
  • PTE2 DIP Switch 0
  • PTE3 DIP Switch 1
  • PTE4 DIP Switch 2
  • PTE5 DIP Switch 3
  • PTC13 Pushbutton SW1
  • PTC17 Pushbutton SW2
  • PTC3 H-Bridge A - 1 FTM0_CH3
  • PTC4 H-Bridge A - 2 FTM0_CH4
  • PTC1 H-Bridge B - 1 FTM0_CH1
  • PTC2 H-Bridge B - 2 FTM0_CH2
  • PTE21 H-Bridge Enable
  • PTE20 H-Bridge Fault
  • PTE23 H-Bridge A - IFB
  • PTE22 H-Bridge B - IFB
Committer:
emh203
Date:
Thu Feb 11 14:58:08 2016 +0000
Revision:
8:24430a0d7fd8
Parent:
3:23cce037011f
removed the old mbed library and main.cpp to make integration easier

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emh203 1:6f37253dab87 1
emh203 1:6f37253dab87 2 #include "mbed.h"
emh203 1:6f37253dab87 3
emh203 1:6f37253dab87 4 /** @file test.h*/
emh203 1:6f37253dab87 5
emh203 1:6f37253dab87 6 /**
emh203 1:6f37253dab87 7 * @defgroup FRDM-TFC_API FRDM-TFC_API
emh203 1:6f37253dab87 8 *
emh203 1:6f37253dab87 9 * @{
emh203 1:6f37253dab87 10 */
emh203 1:6f37253dab87 11
emh203 1:6f37253dab87 12
emh203 1:6f37253dab87 13 /**
emh203 1:6f37253dab87 14
emh203 1:6f37253dab87 15 @addtogroup FRDM-TFC_API
emh203 1:6f37253dab87 16
emh203 1:6f37253dab87 17 @{
emh203 1:6f37253dab87 18
emh203 1:6f37253dab87 19 Resources used by the TFC Library\n
emh203 1:6f37253dab87 20
emh203 1:6f37253dab87 21 I/O:\n
emh203 1:6f37253dab87 22 -------------------------------------------------------------------------------------------------\n
emh203 1:6f37253dab87 23
emh203 1:6f37253dab87 24 PTB0 (Servo Channel 0 - TPM1)\n
emh203 1:6f37253dab87 25 PTB1 (Servo Channel 1 - TPM1)\n
emh203 1:6f37253dab87 26 \n
emh203 1:6f37253dab87 27 PTB8 (Battery LED0)\n
emh203 1:6f37253dab87 28 PTB9 (Battery LED1)\n
emh203 1:6f37253dab87 29 PTB10 (Battery LED2)\n
emh203 1:6f37253dab87 30 PTB11 (Battery LED3)\n
emh203 1:6f37253dab87 31 \n
emh203 1:6f37253dab87 32 PTD7 (Camera SI)\n
emh203 1:6f37253dab87 33 PTE0 (Camera CLK)\n
emh203 1:6f37253dab87 34 PTD5 (Camera A0 - ADC_SE6b)\n
emh203 1:6f37253dab87 35 PTD6 (Camera A1 - ADC_SE7b)\n
emh203 1:6f37253dab87 36 \n
emh203 1:6f37253dab87 37 PTE2 DIP Switch 0\n
emh203 1:6f37253dab87 38 PTE3 DIP Switch 1\n
emh203 1:6f37253dab87 39 PTE4 DIP Switch 2\n
emh203 1:6f37253dab87 40 PTE5 DIP Switch 3\n
emh203 1:6f37253dab87 41
emh203 1:6f37253dab87 42 PTC13 Pushbutton SW1\n
emh203 1:6f37253dab87 43 PTC17 Pushbutton SW2\n
emh203 1:6f37253dab87 44
emh203 1:6f37253dab87 45 PTC3 H-Bridge A - 1 FTM0_CH3\n
emh203 1:6f37253dab87 46 PTC4 H-Bridge A - 2 FTM0_CH4\n
emh203 1:6f37253dab87 47 PTC1 H-Bridge B - 1 FTM0_CH1\n
emh203 1:6f37253dab87 48 PTC2 H-Bridge B - 2 FTM0_CH2\n
emh203 1:6f37253dab87 49
emh203 1:6f37253dab87 50 PTE21 H-Bridge Enable\n
emh203 1:6f37253dab87 51 PTE20 H-Bridge Fault\n
emh203 1:6f37253dab87 52
emh203 1:6f37253dab87 53 PTE23 H-Bridge A - IFB\n
emh203 1:6f37253dab87 54 PTE22 H-Bridge B - IFB\n
emh203 1:6f37253dab87 55
emh203 1:6f37253dab87 56 }
emh203 1:6f37253dab87 57 */
emh203 1:6f37253dab87 58
emh203 1:6f37253dab87 59
emh203 1:6f37253dab87 60
emh203 1:6f37253dab87 61 #ifndef _TFC_H
emh203 1:6f37253dab87 62 #define _TFC_H
emh203 1:6f37253dab87 63
emh203 1:6f37253dab87 64 #define TFC_HBRIDGE_EN_LOC (uint32_t)(1<<21)
emh203 1:6f37253dab87 65 #define TFC_HBRIDGE_FAULT_LOC (uint32_t)(1<<20)
emh203 1:6f37253dab87 66
emh203 1:6f37253dab87 67 #define TFC_HBRIDGE_ENABLE PTE->PSOR = TFC_HBRIDGE_EN_LOC
emh203 1:6f37253dab87 68 #define TFC_HBRIDGE_DISABLE PTE->PCOR = TFC_HBRIDGE_EN_LOC
emh203 1:6f37253dab87 69
emh203 1:6f37253dab87 70 #define TFC_DIP_SWITCH0_LOC ((uint32_t)(1<<2))
emh203 1:6f37253dab87 71 #define TFC_DIP_SWITCH1_LOC ((uint32_t)(1<<3))
emh203 1:6f37253dab87 72 #define TFC_DIP_SWITCH2_LOC ((uint32_t)(1<<4))
emh203 1:6f37253dab87 73 #define TFC_DIP_SWITCH3_LOC ((uint32_t)(1<<5))
emh203 1:6f37253dab87 74
emh203 1:6f37253dab87 75 #define TFC_PUSH_BUTT0N0_LOC ((uint32_t)(1<<13))
emh203 1:6f37253dab87 76 #define TFC_PUSH_BUTT0N1_LOC ((uint32_t)(1<<17))
emh203 1:6f37253dab87 77
emh203 1:6f37253dab87 78 #define TFC_BAT_LED0_LOC ((uint32_t)(1<<11))
emh203 1:6f37253dab87 79 #define TFC_BAT_LED1_LOC ((uint32_t)(1<<10))
emh203 1:6f37253dab87 80 #define TFC_BAT_LED2_LOC ((uint32_t)(1<<9))
emh203 1:6f37253dab87 81 #define TFC_BAT_LED3_LOC ((uint32_t)(1<<8))
emh203 1:6f37253dab87 82
emh203 1:6f37253dab87 83 #define TAOS_CLK_HIGH PTE->PSOR = (1<<1)
emh203 1:6f37253dab87 84 #define TAOS_CLK_LOW PTE->PCOR = (1<<1)
emh203 1:6f37253dab87 85 #define TAOS_SI_HIGH PTD->PSOR = (1<<7)
emh203 1:6f37253dab87 86 #define TAOS_SI_LOW PTD->PCOR = (1<<7)
emh203 1:6f37253dab87 87
emh203 1:6f37253dab87 88
emh203 1:6f37253dab87 89 /**
emh203 1:6f37253dab87 90
emh203 1:6f37253dab87 91 @addtogroup FRDM-TFC_API
emh203 1:6f37253dab87 92 @{
emh203 1:6f37253dab87 93 */
emh203 1:6f37253dab87 94
emh203 1:6f37253dab87 95 /**Macro to turn on LED 0 in the battery indicator array*/
emh203 1:6f37253dab87 96 #define TFC_BAT_LED0_ON PTB->PSOR = TFC_BAT_LED0_LOC
emh203 1:6f37253dab87 97 /** Macro to turn on LED 1 in the battery indicator array*/
emh203 1:6f37253dab87 98 #define TFC_BAT_LED1_ON PTB->PSOR = TFC_BAT_LED1_LOC
emh203 1:6f37253dab87 99 /** Macro to turn on LED 2 in the battery indicator array*/
emh203 1:6f37253dab87 100 #define TFC_BAT_LED2_ON PTB->PSOR = TFC_BAT_LED2_LOC
emh203 1:6f37253dab87 101 /** Macro to turn on LED 3 in the battery indicator array*/
emh203 1:6f37253dab87 102 #define TFC_BAT_LED3_ON PTB->PSOR = TFC_BAT_LED3_LOC
emh203 1:6f37253dab87 103
emh203 1:6f37253dab87 104
emh203 1:6f37253dab87 105 /** Macro to turn off LED 0 in the battery indicator array*/
emh203 1:6f37253dab87 106 #define TFC_BAT_LED0_OFF PTB->PCOR = TFC_BAT_LED0_LOC
emh203 1:6f37253dab87 107 /** Macro to turn off LED 1 in the battery indicator array*/
emh203 1:6f37253dab87 108 #define TFC_BAT_LED1_OFF PTB->PCOR = TFC_BAT_LED1_LOC
emh203 1:6f37253dab87 109 /** Macro to turn off LED 2 in the battery indicator array*/
emh203 1:6f37253dab87 110 #define TFC_BAT_LED2_OFF PTB->PCOR = TFC_BAT_LED2_LOC
emh203 1:6f37253dab87 111 /** Macro to turn off LED 3 in the battery indicator array*/
emh203 1:6f37253dab87 112 #define TFC_BAT_LED3_OFF PTB->PCOR = TFC_BAT_LED3_LOC
emh203 1:6f37253dab87 113
emh203 1:6f37253dab87 114
emh203 1:6f37253dab87 115 /** Macro to toggle LED 0 in the battery indicator array*/
emh203 1:6f37253dab87 116 #define TFC_BAT_LED0_TOGGLE PTB->PTOR = TFC_BAT_LED0_LOC
emh203 1:6f37253dab87 117 /** Macro to toggle LED 1 in the battery indicator array*/
emh203 1:6f37253dab87 118 #define TFC_BAT_LED1_TOGGLE PTB->PTOR = TFC_BAT_LED1_LOC
emh203 1:6f37253dab87 119 /** Macro to toggle LED 2 in the battery indicator array*/
emh203 1:6f37253dab87 120 #define TFC_BAT_LED2_TOGGLE PTB->PTOR = TFC_BAT_LED2_LOC
emh203 1:6f37253dab87 121 /** Macro to toggle LED 3 in the battery indicator array*/
emh203 1:6f37253dab87 122 #define TFC_BAT_LED3_TOGGLE PTB->PTOR = TFC_BAT_LED3_LOC
emh203 1:6f37253dab87 123
emh203 1:6f37253dab87 124
emh203 1:6f37253dab87 125 /** Macro to read the state of the pushbutton SW1*/
emh203 1:6f37253dab87 126 #define TFC_PUSH_BUTTON_0_PRESSED ((PTC->PDIR&TFC_PUSH_BUTT0N0_LOC)>0)
emh203 1:6f37253dab87 127 /** Macro to read the state of the pushbutton SW1*/
emh203 1:6f37253dab87 128 #define TFC_PUSH_BUTTON_1_PRESSED ((PTC->PDIR&TFC_PUSH_BUTT0N1_LOC)>0)
emh203 1:6f37253dab87 129
emh203 1:6f37253dab87 130 /** Macro to read the state of switch 0 in the 4 position DIP switch*/
emh203 1:6f37253dab87 131 #define TFC_DIP_SWITCH_0_ON ((TFC_GetDIP_Switch()&0x01)>0)
emh203 1:6f37253dab87 132
emh203 1:6f37253dab87 133 /** Macro to read the state of switch 1 in the 4 position DIP switch*/
emh203 1:6f37253dab87 134 #define TFC_DIP_SWITCH_1_ON ((TFC_GetDIP_Switch()&0x02)>0)
emh203 1:6f37253dab87 135
emh203 1:6f37253dab87 136 /** Macro to read the state of switch 2 in the 4 position DIP switch*/
emh203 1:6f37253dab87 137 #define TFC_DIP_SWITCH_2_ON ((TFC_GetDIP_Switch()&0x04)>0)
emh203 1:6f37253dab87 138
emh203 1:6f37253dab87 139 /** Macro to read the state of switch 3 in the 4 position DIP switch*/
emh203 1:6f37253dab87 140 #define TFC_DIP_SWITCH_3_ON ((TFC_GetDIP_Switch()&0x08)>0)
emh203 1:6f37253dab87 141
emh203 1:6f37253dab87 142
emh203 1:6f37253dab87 143 /** Initialized the TFC API. Call before using any other API calls.
emh203 1:6f37253dab87 144 *
emh203 1:6f37253dab87 145 */
emh203 1:6f37253dab87 146 void TFC_Init();
emh203 1:6f37253dab87 147
emh203 1:6f37253dab87 148 /** ServoTicker will increment once every servo cycle.
emh203 1:6f37253dab87 149 * It can be used to synchronize events to the start of a servo cycle. ServoTicker is a volatile uint32_t and is updated in the TPM1 overlflow interrupt. This means you will see ServoTicker increment on the rising edge of the servo PWM signal
emh203 1:6f37253dab87 150 *
emh203 1:6f37253dab87 151 */
emh203 1:6f37253dab87 152 extern volatile uint32_t TFC_ServoTicker;
emh203 1:6f37253dab87 153
emh203 1:6f37253dab87 154
emh203 1:6f37253dab87 155 /** Gets the state of the 4-positiomn DIP switch on the FRDM-TFC
emh203 1:6f37253dab87 156 *
emh203 1:6f37253dab87 157 * @returns The lower 4-bits of the return value map to the 4-bits of the DIP switch
emh203 1:6f37253dab87 158 */
emh203 1:6f37253dab87 159 uint8_t TFC_GetDIP_Switch();
emh203 1:6f37253dab87 160
emh203 1:6f37253dab87 161
emh203 1:6f37253dab87 162 /** Reads the state of the pushbuttons (SW1, SW2) on the FRDM-TFC
emh203 1:6f37253dab87 163 * @param Index Selects the pushbutton (0 for SW1 and 1 for SW2)
emh203 1:6f37253dab87 164 * @returns A non-zero value if the button is pushed
emh203 1:6f37253dab87 165 */
emh203 1:6f37253dab87 166 uint8_t TFC_ReadPushButton(uint8_t Index);
emh203 1:6f37253dab87 167
emh203 1:6f37253dab87 168
emh203 1:6f37253dab87 169 /** Controls the 4 battery level LEDs on the FRDM-TFC boards.
emh203 1:6f37253dab87 170 *
emh203 1:6f37253dab87 171 * @param Value The lower 4-bits of the parameter maps to the 4 LEDs.
emh203 1:6f37253dab87 172 */
emh203 1:6f37253dab87 173 void TFC_SetBatteryLED(uint8_t Value);
emh203 1:6f37253dab87 174
emh203 1:6f37253dab87 175
emh203 1:6f37253dab87 176 /** Sets the servo channels
emh203 1:6f37253dab87 177 *
emh203 1:6f37253dab87 178 * @param ServoNumber Which servo channel on the FRDM-TFC to use (0 or 1). 0 is the default channel for steering
emh203 1:6f37253dab87 179 * @param Position Angle setting for servo in a normalized (-1.0 to 1.0) form. The range of the servo can be changed with the InitServos function.
emh203 1:6f37253dab87 180 * This is called in the TFC constructor with some useful default values--> 20mSec period, 0.5mS min and 2.0mSec max. you may need to adjust these for your own particular setup.
emh203 1:6f37253dab87 181 */
emh203 1:6f37253dab87 182 void TFC_SetServo(uint8_t ServoNumber, float Position);
emh203 1:6f37253dab87 183
emh203 1:6f37253dab87 184 /** Initializes TPM for the servoes. It also sets the max and min ranges
emh203 1:6f37253dab87 185 *
emh203 1:6f37253dab87 186 * @param ServoPulseWidthMin Minimum pulse width (in seconds) for the servo. The value of -1.0 in SetServo is mapped to this pulse width. I.E. .001
emh203 1:6f37253dab87 187 * @param ServoPulseWidthMax Maximum pulse width (in seconds) for the servo. The value of +1.0 in SetServo is mapped to this pulse width. I.E. .002
emh203 1:6f37253dab87 188 * @param ServoPeriod Period of the servo pulses (in seconds). I.e. .020 for 20mSec
emh203 1:6f37253dab87 189 */
emh203 1:6f37253dab87 190
emh203 1:6f37253dab87 191 void TFC_InitServos(float ServoPulseWidthMin, float ServoPulseWidthMax, float ServoPeriod);
emh203 1:6f37253dab87 192
emh203 1:6f37253dab87 193
emh203 1:6f37253dab87 194 /** Initialized TPM0 to be used for generating PWM signals for the the dual drive motors. This method is called in the TFC constructor with a default value of 4000.0Hz
emh203 1:6f37253dab87 195 *
emh203 1:6f37253dab87 196 * @param SwitchingFrequency PWM Switching Frequency in floating point format. Pick something between 1000 and 9000. Maybe you can modulate it and make a tune.
emh203 1:6f37253dab87 197 */
emh203 1:6f37253dab87 198 void TFC_InitMotorPWM(float SwitchingFrequency);
emh203 1:6f37253dab87 199
emh203 1:6f37253dab87 200 /** Sets the PWM value for each motor.
emh203 1:6f37253dab87 201 *
emh203 1:6f37253dab87 202 * @param MotorA The PWM value for HBridgeA. The value is normalized to the floating point range of -1.0 to +1.0. -1.0 is 0% (Full Reverse on the H-Bridge) and 1.0 is 100% (Full Forward on the H-Bridge)
emh203 1:6f37253dab87 203 * @param MotorB The PWM value for HBridgeB. The value is normalized to the floating point range of -1.0 to +1.0. -1.0 is 0% (Full Reverse on the H-Bridge) and 1.0 is 100% (Full Forward on the H-Bridge)
emh203 1:6f37253dab87 204 */
emh203 1:6f37253dab87 205 void TFC_SetMotorPWM(float MotorA ,float MotorB);
emh203 1:6f37253dab87 206
emh203 1:6f37253dab87 207 /** Reads the potentiometers
emh203 1:6f37253dab87 208 *
emh203 1:6f37253dab87 209 * @param Channel Selects which pot is read. I.e. 0 for POT0 or 1 for POT1
emh203 1:6f37253dab87 210 * @returns Pot value from -1.0 to 1.0
emh203 1:6f37253dab87 211 */
emh203 1:6f37253dab87 212 float TFC_ReadPot(uint8_t Channel);
emh203 1:6f37253dab87 213
emh203 1:6f37253dab87 214 /** Gets the current battery voltage
emh203 1:6f37253dab87 215 *
emh203 1:6f37253dab87 216 * @returns Battery voltage in floating point form.
emh203 1:6f37253dab87 217 */
emh203 1:6f37253dab87 218 float TFC_ReadBatteryVoltage();
emh203 1:6f37253dab87 219
emh203 1:6f37253dab87 220
emh203 3:23cce037011f 221
emh203 3:23cce037011f 222 /** Sets the Battery level indiciate
emh203 3:23cce037011f 223 *
emh203 3:23cce037011f 224 * @param BattLevel A number betwween 0 and 4. This will light the bar from left to right with the specifified number of segments.
emh203 3:23cce037011f 225 *
emh203 3:23cce037011f 226 */
emh203 3:23cce037011f 227 void TFC_SetBatteryLED_Level(uint8_t BattLevel);
emh203 3:23cce037011f 228
emh203 3:23cce037011f 229
emh203 1:6f37253dab87 230 /** Pointer to two channels of line scan camera data. Each channel is 128 points of uint8_t's. Note that the underlying implementation is ping-pong buffer These pointers will point to the
emh203 1:6f37253dab87 231 *inactive buffer.
emh203 1:6f37253dab87 232 *
emh203 1:6f37253dab87 233 */
emh203 1:6f37253dab87 234
emh203 3:23cce037011f 235 extern volatile uint16_t * TFC_LineScanImage0;
emh203 3:23cce037011f 236 extern volatile uint16_t * TFC_LineScanImage1;
emh203 3:23cce037011f 237
emh203 1:6f37253dab87 238
emh203 1:6f37253dab87 239 /** This flag will increment when a new frame is ready. Check for a non zero value (and reset to zero!) when you want to read the camera(s)
emh203 1:6f37253dab87 240 *
emh203 1:6f37253dab87 241 */
emh203 1:6f37253dab87 242
emh203 3:23cce037011f 243 extern volatile uint8_t TFC_LineScanImageReady;
emh203 3:23cce037011f 244
emh203 3:23cce037011f 245
emh203 3:23cce037011f 246
emh203 1:6f37253dab87 247
emh203 1:6f37253dab87 248
emh203 1:6f37253dab87 249 /** @} */
emh203 1:6f37253dab87 250
emh203 1:6f37253dab87 251
emh203 1:6f37253dab87 252 #endif