Updated TFC library to be compatible with the recent hardware changes. Currently only CCD1, Servo1, Motor1, and Motor2 are interfaced.

Dependencies:   mbed

Dependents:   TFC-TEST_UPDATED_HW

Fork of FRDM-TFC by Eli Hughes

Revision:
9:9c61b6ebc028
Parent:
3:23cce037011f
--- a/TFC.cpp	Tue Apr 15 02:36:19 2014 +0000
+++ b/TFC.cpp	Fri Jan 12 18:22:35 2018 +0000
@@ -4,20 +4,19 @@
 #define FTM1_CLK_PRESCALE                                                            6// Prescale Selector value - see comments in Status Control (SC) section for more details
 #define SERVO_DEFAULT_PERIOD                                                   (float)(.020)   // Desired Frequency of PWM Signal - Here 50Hz => 20ms period
 // use these to dial in servo steering to your particular servo
-#define SERVO_MIN_PULSE_WIDTH_DEFAULT                                          (float)(.0005)  // The number here should be be *pulse width* in seconds to move servo to its left limit
-#define SERVO_MAX_PULSE_WIDTH_DEFAULT                                          (float)(.002)  // The number here should be be *pulse width* in seconds to move servo to its left limit 
-
+#define SERVO_MIN_PULSE_WIDTH_DEFAULT                                          (float)0.0011  // The number here should be be *pulse width* in seconds to move servo to its right limit
+#define SERVO_MAX_PULSE_WIDTH_DEFAULT                                          (float)0.00148  // The number here should be be *pulse width* in seconds to move servo to its left limit 
 
 #define FTM0_CLOCK                                             (SystemCoreClock/2)
 #define FTM0_CLK_PRESCALE                                      (0)  // Prescale Selector value - see comments in Status Control (SC) section for more details
-#define FTM0_DEFAULT_SWITCHING_FREQUENCY                      (4000.0)
+#define FTM0_DEFAULT_SWITCHING_FREQUENCY                       (4000.0)
 
 #define ADC_MAX_CODE    (4095)
 
-#define TAOS_CLK_HIGH  PTE->PSOR = (1<<1)
-#define TAOS_CLK_LOW   PTE->PCOR = (1<<1)
-#define TAOS_SI_HIGH   PTD->PSOR = (1<<7)
-#define TAOS_SI_LOW    PTD->PCOR = (1<<7)
+#define TAOS_CLK_HIGH  PTB->PSOR = (1<<9)
+#define TAOS_CLK_LOW   PTB->PCOR = (1<<9)
+#define TAOS_SI_HIGH   PTB->PSOR = (1<<8)
+#define TAOS_SI_LOW    PTB->PCOR = (1<<8)
 
 #define ADC_STATE_INIT                          0
 #define ADC_STATE_CAPTURE_POT_0                 1
@@ -29,8 +28,8 @@
 #define TFC_POT_0_ADC_CHANNEL       13
 #define TFC_POT_1_ADC_CHANNEL       12
 #define TFC_BAT_SENSE_CHANNEL       4
-#define TFC_LINESCAN0_ADC_CHANNEL   6
-#define TFC_LINESCAN1_ADC_CHANNEL   7
+#define TFC_LINESCAN0_ADC_CHANNEL   11
+#define TFC_LINESCAN1_ADC_CHANNEL   15
 
 
 #define ADC0_irq_no   57
@@ -383,80 +382,8 @@
 
 void TFC_GPIO_Init()
 {
-
     //enable Clocks to all ports
-
     SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;
-
-    //Setup Pins as GPIO
-    PORTE->PCR[21] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
-    PORTE->PCR[20] = PORT_PCR_MUX(1);
-
-    //Port for Pushbuttons
-    PORTC->PCR[13] = PORT_PCR_MUX(1);
-    PORTC->PCR[17] = PORT_PCR_MUX(1);
-
-
-    //Ports for DIP Switches
-    PORTE->PCR[2] = PORT_PCR_MUX(1);
-    PORTE->PCR[3] = PORT_PCR_MUX(1);
-    PORTE->PCR[4] = PORT_PCR_MUX(1);
-    PORTE->PCR[5] = PORT_PCR_MUX(1);
-
-    //Ports for LEDs
-    PORTB->PCR[8] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
-    PORTB->PCR[9] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
-    PORTB->PCR[10] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
-    PORTB->PCR[11] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
-
-
-    //Setup the output pins
-    PTE->PDDR =  TFC_HBRIDGE_EN_LOC;
-    PTB->PDDR =  TFC_BAT_LED0_LOC  | TFC_BAT_LED1_LOC | TFC_BAT_LED2_LOC | TFC_BAT_LED3_LOC;
-
-    TFC_SetBatteryLED(0);
-    TFC_HBRIDGE_DISABLE;
-}
-
-void TFC_SetBatteryLED(uint8_t Value)
-{
-    if(Value & 0x01)
-        TFC_BAT_LED0_ON;
-    else
-        TFC_BAT_LED0_OFF;
-
-    if(Value & 0x02)
-        TFC_BAT_LED1_ON;
-    else
-        TFC_BAT_LED1_OFF;
-
-    if(Value & 0x04)
-        TFC_BAT_LED2_ON;
-    else
-        TFC_BAT_LED2_OFF;
-
-    if(Value & 0x08)
-        TFC_BAT_LED3_ON;
-    else
-        TFC_BAT_LED3_OFF;
-}
-
-uint8_t TFC_GetDIP_Switch()
-{
-    uint8_t DIP_Val=0;
-
-    DIP_Val = (PTE->PDIR>>2) & 0xF;
-
-    return DIP_Val;
-}
-
-uint8_t TFC_ReadPushButton(uint8_t Index)
-{
-    if(Index == 0) {
-        return TFC_PUSH_BUTTON_0_PRESSED;
-    } else {
-        return TFC_PUSH_BUTTON_1_PRESSED;
-    }
 }
 
 extern "C" void TPM1_IRQHandler()
@@ -488,7 +415,7 @@
 void TFC_InitServos(float PulseWidthMin, float PulseWidthMax, float ServoPeriod)
 {
 
-    SIM->SCGC5 |= SIM_SCGC5_PORTB_MASK; 
+    SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK; 
 
     _ServoPeriod = ServoPeriod;
     _ServoDutyCycleMin = PulseWidthMin/ServoPeriod;
@@ -540,8 +467,8 @@
 
     //Enable the FTM functions on the the port
 
-    PORTB->PCR[0] = PORT_PCR_MUX(3);
-    PORTB->PCR[1] = PORT_PCR_MUX(3);
+    PORTA->PCR[12] = PORT_PCR_MUX(3);
+    PORTA->PCR[13] = PORT_PCR_MUX(3);
 
 }
 
@@ -876,16 +803,15 @@
 
 void TFC_InitLineScanCamera()
 {
-    SIM->SCGC5 |=   SIM_SCGC5_PORTE_MASK | SIM_SCGC5_PORTD_MASK; //Make sure the clock is enabled for PORTE;
-    PORTE->PCR[1] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;   //Enable GPIO on on the pin for the CLOCK Signal
-    PORTD->PCR[7] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;   //Enable GPIO on on the pin for SI signal
-
-    PORTD->PCR[5] = PORT_PCR_MUX(0); //Make sure AO signal goes to an analog input
-    PORTD->PCR[6] = PORT_PCR_MUX(0); //Make sure AO signal goes to an analog input
+    SIM->SCGC5 |=   SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK; //Make sure the clock is enabled for PORTE;
+    //Set pins for CCD0
+    PORTB->PCR[9] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;   //Enable GPIO on on the pin for the CLOCK Signal
+    PORTB->PCR[8] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;   //Enable GPIO on on the pin for SI signal
+    PORTC->PCR[2] = PORT_PCR_MUX(0); //Make sure AO signal goes to an analog input
 
     //Make sure the Clock and SI pins are outputs
-    PTD->PDDR |= (1<<7);
-    PTE->PDDR |= (1<<1);
+    PTB->PDDR |= (1<<8);
+    PTB->PDDR |= (1<<9);
 
     TAOS_CLK_LOW;
     TAOS_SI_LOW;
@@ -896,7 +822,7 @@
     LineScanImage1WorkingBuffer = &LineScanImage1Buffer[LineScanWorkingBuffer][0];
 
     TFC_LineScanImage0 = &LineScanImage0Buffer[1][0];
-    TFC_LineScanImage1  = &LineScanImage1Buffer[1][0];
+    TFC_LineScanImage1 = &LineScanImage1Buffer[1][0];
 }
 
 
@@ -913,8 +839,8 @@
 
     //1st,  set the clock mux
     //See Page 124 of f the KL25 Sub-Family Reference Manual, Rev. 3, September 2012
-    SIM->SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK;// We Want MCGPLLCLK/2 (See Page 196 of the KL25 Sub-Family Reference Manual, Rev. 3, September 2012)
-    SIM->SOPT2 &= ~(SIM_SOPT2_TPMSRC_MASK);
+    //SIM->SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK;// We Want MCGPLLCLK/2 (See Page 196 of the KL25 Sub-Family Reference Manual, Rev. 3, September 2012)
+    //SIM->SOPT2 &= ~(SIM_SOPT2_TPMSRC_MASK);
     SIM->SOPT2 |= SIM_SOPT2_TPMSRC(1); //We want the MCGPLLCLK/2 (See Page 196 of the KL25 Sub-Family Reference Manual, Rev. 3, September 2012)
 
 
@@ -929,18 +855,16 @@
     TPM0->CONF = 0;
 
     //While the counter is disabled we can setup the prescaler
-
     TPM0->SC = TPM_SC_PS(FTM0_CLK_PRESCALE);
 
     //Setup the mod register to get the correct PWM Period
-
     TPM0->MOD = (uint32_t)((float)(FTM0_CLOCK/(1<<FTM0_CLK_PRESCALE))/SwitchingFrequency);
 
-    //Setup Channels 0,1,2,3
-    TPM0->CONTROLS[0].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK;
-    TPM0->CONTROLS[1].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSA_MASK; // invert the second PWM signal for a complimentary output;
-    TPM0->CONTROLS[2].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK;
-    TPM0->CONTROLS[3].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSA_MASK; // invert the second PWM signal for a complimentary output;
+    //Setup Channels 1,2,4,5
+    TPM0->CONTROLS[1].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK;
+    TPM0->CONTROLS[2].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSA_MASK; // invert the second PWM signal for a complimentary output;
+    TPM0->CONTROLS[4].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK;
+    TPM0->CONTROLS[5].CnSC = TPM_CnSC_MSB_MASK | TPM_CnSC_ELSA_MASK; // invert the second PWM signal for a complimentary output;
 
     //Enable the Counter
 
@@ -951,10 +875,10 @@
     TPM0->SC |= TPM_SC_CMOD(1);
 
     //Enable the FTM functions on the the port
-    PORTC->PCR[1] = PORT_PCR_MUX(4);
-    PORTC->PCR[2] = PORT_PCR_MUX(4);
-    PORTC->PCR[3] = PORT_PCR_MUX(4);
-    PORTC->PCR[4] = PORT_PCR_MUX(4);
+    PORTA->PCR[4] = PORT_PCR_MUX(3);        //FTM0_CH1
+    PORTA->PCR[5] = PORT_PCR_MUX(3);        //FTM0_CH2
+    PORTC->PCR[8] = PORT_PCR_MUX(3);        //FTM0_CH4
+    PORTC->PCR[9] = PORT_PCR_MUX(3);        //FTM0_CH5
 
 }
 
@@ -970,67 +894,9 @@
     else if(MotorB<-1.0)
         MotorB = -1.0;
 
-    TPM0->CONTROLS[2].CnV = (uint16_t) ((float)TPM0->MOD * (float)((MotorA + 1.0)/2.0));
-    TPM0->CONTROLS[3].CnV = TPM0->CONTROLS[2].CnV;
-    TPM0->CONTROLS[0].CnV = (uint16_t) ((float)TPM0->MOD * (float)((MotorB + 1.0)/2.0));
-    TPM0->CONTROLS[1].CnV = TPM0->CONTROLS[0].CnV;
+    TPM0->CONTROLS[1].CnV = (uint16_t) ((float)TPM0->MOD * (float)((MotorA + 1.0)/2.0));
+    TPM0->CONTROLS[2].CnV = TPM0->CONTROLS[1].CnV;
+    TPM0->CONTROLS[4].CnV = (uint16_t) ((float)TPM0->MOD * (float)((MotorB + 1.0)/2.0));
+    TPM0->CONTROLS[5].CnV = TPM0->CONTROLS[4].CnV;
 
 }
-
-//Pot Reading is Scaled to return a value of -1.0 to 1.0
-float TFC_ReadPot(uint8_t Channel)
-{
-    if(Channel == 0)
-        return ((float)PotADC_Value[0]/-((float)ADC_MAX_CODE/2.0))+1.0;
-    else
-        return ((float)PotADC_Value[1]/-((float)ADC_MAX_CODE/2.0))+1.0;
-}
-
-float TFC_ReadBatteryVoltage()
-{
-    return (((float)BatSenseADC_Value/(float)(ADC_MAX_CODE)) * 3.0);// * ((47000.0+10000.0)/10000.0);
-}
-
-
-void TFC_SetBatteryLED_Level(uint8_t BattLevel)
-{
-    switch(BattLevel)
-    {
-        default:
-        case 0:
-            TFC_BAT_LED0_OFF;
-            TFC_BAT_LED1_OFF; 
-            TFC_BAT_LED2_OFF; 
-            TFC_BAT_LED3_OFF;
-        break;
-    
-        case 1:
-            TFC_BAT_LED0_ON;
-            TFC_BAT_LED1_OFF; 
-            TFC_BAT_LED2_OFF; 
-            TFC_BAT_LED3_OFF;
-        break;
-        
-        case 2:
-            TFC_BAT_LED0_ON;
-            TFC_BAT_LED1_ON; 
-            TFC_BAT_LED2_OFF; 
-            TFC_BAT_LED3_OFF;
-        break;
-        
-        case 3:
-            TFC_BAT_LED0_ON;
-            TFC_BAT_LED1_ON; 
-            TFC_BAT_LED2_ON; 
-            TFC_BAT_LED3_OFF;
-        break;
-        
-        case 4:
-            TFC_BAT_LED0_ON;
-            TFC_BAT_LED1_ON; 
-            TFC_BAT_LED2_ON; 
-            TFC_BAT_LED3_ON;
-        break;
-        
-    }
-}