/* * * FM0+ Example program * This program reads the analog voltage on AN19 and uses it to adjust the * PWM output on TIOA5 * *This example was based in part on the FM0+ examples by Edison Zhang, Spansion Corp. * **/ /*Includes*/ #include "pdl_header.h" /*Defines*/ #define User_Timer BT5 /*Globals*/ //PWM globals uint16_t Pulse_Value = 9999; //Duty Cycle Value stc_bt_pwm_config_t stcPwmConfig; //PWM Configuration Structure //ADC globals stc_adcn_t *pstcAdc = (stc_adcn_t *)&ADC0; stc_adc_config_t stcConfig; stc_adc_prio_t stcPrioCfg; uint16_t ADC_Val = 0; //ADC Voltage Reading uint32_t ADC_READ = 0; //ADC FIFO Data uint32_t Sample_Count = 10; /*Function prototypes*/ void ConfigurePWM(void); void ConfigureADC(void); /*Main*/ int32_t main(void) { /* Initialize GPIO pin as PWM pin..aka map the base timer to the correct IO port */ SetPinFunc_TIOA5_1_OUT(); /*Configure ADC*/ ConfigureADC(); /*Configure and Start PWM*/ ConfigurePWM(); /*Start ADC*/ if ( Adc_Init(pstcAdc, &stcConfig) == Ok) //Init ADC0 { Adc_EnableWaitReady(pstcAdc); //Enable ADC0 & wait for initialization } /* Read ADC and adjust Duty Cycle*/ while(1) { Adc_SwTriggerPrio(pstcAdc); //Trigger ADC0 while (1) { if (TRUE == Adc_GetIrqFlag(pstcAdc, AdcPrioIrq)) //Wait for ADC conversion { Adc_ClrIrqFlag(pstcAdc, AdcPrioIrq); break; } } ADC_READ = Adc_ReadPrioFifo(pstcAdc); //Read ADC FIFO ADC_Val = Adc_GetPrioData(pstcAdc, ADC_READ); //Get voltage reading Pulse_Value = 9999 - ADC_Val*2; //Scale Duty Cycle to ADC reading Bt_Pwm_WriteDutyVal(&User_Timer,Pulse_Value);//Write new Duty Cycle }; } void ConfigurePWM(void) { /*Wipe structure*/ PDL_ZERO_STRUCT(stcPwmConfig); /*Configure and Initialize PWM timer*/ stcPwmConfig.enPres = PwmPres1Div4; //20Mhz/4 = 5Mhz PWM clock stcPwmConfig.enMode = PwmContinuous; //Enable continous mode stcPwmConfig.enExtTrig = PwmExtTrigDisable; //Disable External Trigger stcPwmConfig.enOutputMask = PwmOutputNormal; //Normal Output (no Mask) stcPwmConfig.enOutputPolarity = PwmPolarityLow; //Initial Polarity Low stcPwmConfig.enRestartEn = PwmRestartEnable; //Restart Enabled Bt_Pwm_Init(&User_Timer , &stcPwmConfig); //Init PWM with new Config /* Set I/O mode */ Bt_ConfigIOMode(&User_Timer, BtIoMode0); /* Set cycle and duty value*/ Bt_Pwm_WriteCycleVal(&User_Timer, 9999); // Cycle = 200us Bt_Pwm_WriteDutyVal(&User_Timer, Pulse_Value); // Duty = start at 100% /*Enable Counter Operation*/ Bt_Pwm_EnableCount(&User_Timer); /*Enable Software Trigger/Start PWM timer*/ Bt_Pwm_EnableSwTrig(&User_Timer); } void ConfigureADC(void) { /*Wipe structures*/ PDL_ZERO_STRUCT(stcConfig); PDL_ZERO_STRUCT(stcPrioCfg); /*Initialize priority conversion*/ stcPrioCfg.bPrioExtTrigStartEnable = FALSE; //Disable External trigger stcPrioCfg.bPrioTimerStartEnable = FALSE; //Disable Tiimer trigger start stcPrioCfg.enPrioTimerTrigger = AdcNoTimer; //Disable Trigger timer stcPrioCfg.u8PrioFifoDepth = 0; //Set FIFO depth = 1 reading stcPrioCfg.u8PrioLevel1AnalogChSel = 0; stcPrioCfg.u8PrioLevel2AnalogChSel = 19; //Select ADC input pin AN19 stcConfig.u32SamplingTimeSelect.u32AD_CHn = 0; //Sample on channel 0 stcConfig.enSamplingTimeN0 = Value8; //ST N0 Config bits stcConfig.u8SamplingTime0 = 8u; //ST value for 0 stcConfig.enSamplingTimeN1 = Value8; //ST N1 Config bits stcConfig.u8SamplingTime1 = 8u; //ST value for 1 stcConfig.u8ComparingClockDiv = 3u; //Frequency division ratio stcConfig.pstcPrioInit = &stcPrioCfg; }