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.
Dependents: TFC-TEST_UPDATED_HW
Fork of FRDM-TFC by
Diff: TFC.cpp
- 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;
-
- }
-}
