Author Topic: ATSAM4SD32C | ADC issues.  (Read 1832 times)

0 Members and 1 Guest are viewing this topic.

Offline CM800Topic starter

  • Frequent Contributor
  • **
  • Posts: 882
  • Country: 00
ATSAM4SD32C | ADC issues.
« on: December 17, 2015, 10:41:58 pm »
I'm afraid I'm back again, I have an issue with my ADC I cannot seem to resolve... the support for Atmel is very restrictive (mostly surrounds the Arduino area. Considering moving over to STM32 or a Freescale solution...

Does anyone see what I am doing wrong here? I have been scratching my head all day on this with little to show for it.


Code: [Select]
#include <asf.h>


void ADC_IrqHandler(void);
void ADC_Setup(void);
void PWM_Setup(void);

void ADC_IrqHandler(void)
{
//Check the ADC conversion status
if ((adc_get_status(ADC) & ADC_ISR_DRDY) == ADC_ISR_DRDY)
{
//Get latest digital data value from ADC and can be used by application
uint32_t result = adc_get_latest_value(ADC);
PWM->PWM_CH_NUM[0].PWM_CPRDUPD = result;
PWM->PWM_CH_NUM[0].PWM_CDTYUPD = result;

PIOA->PIO_CODR = PIO_PA20;

}
}

void ADC_Setup(void)
{
pmc_enable_periph_clk(ID_ADC);

PIOB->PIO_PDR |= PIO_PB1X1_AD5;

adc_init(ADC, sysclk_get_main_hz(), sysclk_get_main_hz()/4, ADC_STARTUP_TIME_4);
adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1);
adc_set_resolution(ADC, ADC_MR_LOWRES_BITS_12);
adc_enable_channel(ADC, ADC_CHANNEL_5);
adc_enable_interrupt(ADC, ADC_IER_DRDY);
adc_configure_trigger(ADC, ADC_TRIG_SW, 0);

}

void PWM_Setup(void)
{
PIOA->PIO_PER &= ~PIO_PA11B_PWMH0 & ~PIO_PA19B_PWML0;
PIOA->PIO_PDR |= PIO_PA11B_PWMH0 | PIO_PA19B_PWML0; // enable PWM
PIOA->PIO_IER &= ~PIO_PA11B_PWMH0 & ~PIO_PA19B_PWML0;; // disable interrupts
PIOA->PIO_IDR |= PIO_PA11B_PWMH0 | PIO_PA19B_PWML0;
PIOA->PIO_ABCDSR[0] = PIO_PA11B_PWMH0 | PIO_PA19B_PWML0; // assign pin to peripheral B

pmc_enable_periph_clk(ID_PWM);

PWM->PWM_WPCR = PWM_WPCR_WPKEY_PASSWD | (PWM_WPCR_WPRG4 << 2) | PWM_WPCR_WPCMD_DISABLE_SW_PROT;
}

int main (void)
{
/* Insert system clock initialization code here (sysclk_init()). */
sysclk_init();
board_init();

pmc_enable_periph_clk(ID_PIOA);
pmc_enable_periph_clk(ID_PIOB);

PWM_Setup();
ADC_Setup();


adc_start(ADC);

int32_t width = 500;
int32_t duty = 250;
// equal deadtime

PWM->PWM_CH_NUM[0].PWM_CMR = (PWM_CMR_CPRE_MCK_DIV_8 & 0xF) | PWM_CMR_DTE | PWM_CMR_CALG;

PWM->PWM_CH_NUM[0].PWM_CPRD = width;

PWM->PWM_CH_NUM[0].PWM_CDTY = duty;

PWM->PWM_CH_NUM[0].PWM_DT = 5 | (10 <<15);

PWM->PWM_ENA = (1 << PWM_CHANNEL_0);


PIOA->PIO_PER |= PIO_PA20;
PIOA->PIO_OER = PIO_PA20;
PIOA->PIO_PUDR = PIO_PA20;


while(1)
{

};

}
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf