Please help! I am currently looking to control a motor using an Arduino DUE. To do this, I need to perform current sensing. Here is the program I used as a reference. This program also interrupts at the top of the triangle wave.
In this program, which pin on the Arduino DUE should I input the current sensor output voltage?
Also, how can I check the AD converted value on the serial monitor?
Thank you very much.
int Iu_ad;
int Iv_ad;
int Iw_ad;
void pwm3_setup(){
uint16_t CounterPeriod;
uint16_t DeadTime;
CounterPeriod = 4200 - 1;
DeadTime = 100;
//PWM Power ON
REG_PMC_PCER1=PMC_PCER1_PID36;
//Set the carrier frequency
//use PWM1~3 as 3-phase PWM, PWM0 is for PWM synchronous AD conversion
REG_PWM_CPRD0 = CounterPeriod;
REG_PWM_CPRD1 = CounterPeriod;
REG_PWM_CPRD2 = CounterPeriod;
REG_PWM_CPRD3 = CounterPeriod;
//Setting the duty command for each phase
REG_PWM_CDTY1 = 2100;
REG_PWM_CDTY2 = 2100;
REG_PWM_CDTY3 = 2100;
//Enable dead time, prescaler = 0, triangle wave setting
REG_PWM_CMR0 = PWM_CMR_CALG | PWM_CMR_CPRE_MCK;
REG_PWM_CMR1 = PWM_CMR_DTE | PWM_CMR_CALG | PWM_CMR_CPRE_MCK;
REG_PWM_CMR2 = PWM_CMR_DTE | PWM_CMR_CALG | PWM_CMR_CPRE_MCK;
REG_PWM_CMR3 = PWM_CMR_DTE | PWM_CMR_CALG | PWM_CMR_CPRE_MCK;
//Setting the dead time for PWMH and PWML
REG_PWM_DT1 = PWM_DT_DTH(DeadTime) | PWM_DT_DTL(DeadTime);
REG_PWM_DT2 = PWM_DT_DTH(DeadTime) | PWM_DT_DTL(DeadTime);
REG_PWM_DT3 = PWM_DT_DTH(DeadTime) | PWM_DT_DTL(DeadTime);
REG_PIOC_PDR = PIO_PDR_P9 | PIO_PDR_P8 | PIO_PDR_P7 | PIO_PDR_P6 | PIO_PDR_P5 | PIO_PDR_P4;
REG_PIOC_ABSR |= PIO_ABSR_P9 | PIO_ABSR_P8 | PIO_ABSR_P7 | PIO_ABSR_P6 | PIO_ABSR_P5 | PIO_ABSR_P4;
//PWM event line settings for AD conversion
PWM->PWM_CMP[0].PWM_CMPM = PWM_CMPM_CEN;
PWM->PWM_ELMR[1] = PWM_ELMR_CSEL0;
PWM->PWM_CMP[0].PWM_CMPV = PWM_CMPV_CV(CounterPeriod - 10);
REG_PWM_ENA = PWM_ENA_CHID3 | PWM_ENA_CHID2 | PWM_ENA_CHID1 | PWM_ENA_CHID0;
}
void adc_setup() {
PMC->PMC_PCER1 |= PMC_PCER1_PID37; // ADC power on
ADC->ADC_CR = ADC_CR_SWRST; // Reset ADC
ADC->ADC_MR = ADC_MR_TRGEN_EN // Hardware trigger select
| ADC_MR_TRGSEL_ADC_TRIG5 // Trigger by PWM Event Line 1
| ADC_MR_PRESCAL(1);
ADC->ADC_IER = ADC_IER_EOC7; // End Of Conversion interrupt enable for channel 7
NVIC_EnableIRQ(ADC_IRQn); // Enable ADC interrupt
ADC->ADC_CHER = ADC_CHER_CH7 | ADC_CHER_CH6 | ADC_CHER_CH5; // Enable Channel 5~7
}
int main (void){
}
;
void loop(){
};
void ADC_Handler() {
Iu_ad = ADC->ADC_CDR[7]; // Read and clear status register
Iv_ad = ADC->ADC_CDR[6];
Iw_ad = ADC->ADC_CDR[5];
PIOB->PIO_ODSR ^= PIO_ODSR_P27;
}