This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

is am3359 can be used for pmsm motor control application

Other Parts Discussed in Thread: AM3359

Dear all,

We are using am3359 platform for pmsm motor control application, but now we seems get some problems on the ADC module of am3359: Every time we try to sample the current on two phases of the pmsm motor, the adc module of am3359 seems not work properly.

We are not sure am3359 platform can be used for pmsm motor control application as before I asked similar problem in the forum but got the reply that I should use the dsp platform. I wander is there any body successfully use the am3359 for motor control?

Thank you for any direction!

Tao

  • Hi Tao,

    What is your hardware circuit to sample the current with the ADC? What software are you using?

  • Hello Biser, 

    Thank you very much for your quick response. 

    The circuit is:

    The code for initializing the ADC is:

    Void ADCInit();

    and every time when we sampling, we use the following code: 

    ADCStart() ;

    ADCWaitAndRead(x);

    The functions above are defined in the following files:

    2134.ADC.h

    /*
     * ADC.c
     *
     *  Created on: 2014-1-1
     *      Author: njtz.wei
     */
    
    #include <xdc/std.h>
    
    #include <xdc/runtime/Error.h>
    #include <xdc/runtime/System.h>
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    #include <ti/sysbios/knl/Idle.h>
    #include <ti/sysbios/family/arm/a8/intcps/Hwi.h>
    
    #include "hw_control_AM335x.h"
    #include <hw_cm_per.h>
    #include "soc_AM335x.h"
    #include "armv7a/am335x/interrupt.h"
    #include "hw_types.h"
    #include "tsc_adc.h"
    #include "armv7a/am335x/evmAM335x.h"
    
    #include "ADC.h"
    
    #include "evmAM335x.h"
    #include "hw_cm_wkup.h"
    
    
    
    /*
    ** This function enables the system L3 and system L4_WKUP clocks.
    ** This also enables the clocks for TSC instance.
    */
    
    void TSCADCModuleClkConfig(void)
    {
        /* Configuring L3 Interface Clocks. */
    
        /* Writing to MODULEMODE field of CM_PER_L3_CLKCTRL register. */
        HWREG(SOC_CM_PER_REGS + CM_PER_L3_CLKCTRL) |=
              CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;
    
        /* Waiting for MODULEMODE field to reflect the written value. */
        while(CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3_CLKCTRL) &
               CM_PER_L3_CLKCTRL_MODULEMODE));
    
        /* Writing to MODULEMODE field of CM_PER_L3_INSTR_CLKCTRL register. */
        HWREG(SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL) |=
              CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;
    
        /* Waiting for MODULEMODE field to reflect the written value. */
        while(CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL) &
               CM_PER_L3_INSTR_CLKCTRL_MODULEMODE));
    
        /* Writing to CLKTRCTRL field of CM_PER_L3_CLKSTCTRL register. */
        HWREG(SOC_CM_PER_REGS + CM_PER_L3_CLKSTCTRL) |=
              CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
    
        /* Waiting for CLKTRCTRL field to reflect the written value. */
        while(CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3_CLKSTCTRL) &
               CM_PER_L3_CLKSTCTRL_CLKTRCTRL));
    
        /* Writing to CLKTRCTRL field of CM_PER_OCPWP_L3_CLKSTCTRL register. */
        HWREG(SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) |=
              CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
    
        /*Waiting for CLKTRCTRL field to reflect the written value. */
        while(CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) &
               CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL));
    
        /* Writing to CLKTRCTRL field of CM_PER_L3S_CLKSTCTRL register. */
        HWREG(SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL) |=
              CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
    
        /*Waiting for CLKTRCTRL field to reflect the written value. */
        while(CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL) &
               CM_PER_L3S_CLKSTCTRL_CLKTRCTRL));
    
        /* Checking fields for necessary values.  */
    
        /* Waiting for IDLEST field in CM_PER_L3_CLKCTRL register to be set to 0x0. */
        while((CM_PER_L3_CLKCTRL_IDLEST_FUNC << CM_PER_L3_CLKCTRL_IDLEST_SHIFT)!=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3_CLKCTRL) & CM_PER_L3_CLKCTRL_IDLEST));
    
        /*
        ** Waiting for IDLEST field in CM_PER_L3_INSTR_CLKCTRL register to attain the
        ** desired value.
        */
        while((CM_PER_L3_INSTR_CLKCTRL_IDLEST_FUNC <<
               CM_PER_L3_INSTR_CLKCTRL_IDLEST_SHIFT)!=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL) &
               CM_PER_L3_INSTR_CLKCTRL_IDLEST));
    
        /*
        ** Waiting for CLKACTIVITY_L3_GCLK field in CM_PER_L3_CLKSTCTRL register to
        ** attain the desired value.
        */
        while(CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3_CLKSTCTRL) &
               CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK));
    
        /*
        ** Waiting for CLKACTIVITY_OCPWP_L3_GCLK field in CM_PER_OCPWP_L3_CLKSTCTRL
        ** register to attain the desired value.
        */
        while(CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) &
               CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK));
    
        /*
        ** Waiting for CLKACTIVITY_L3S_GCLK field in CM_PER_L3S_CLKSTCTRL register
        ** to attain the desired value.
        */
        while(CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK !=
              (HWREG(SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL) &
              CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK));
    
    
        /* Configuring registers related to Wake-Up region. */
    
        /* Writing to MODULEMODE field of CM_WKUP_CONTROL_CLKCTRL register. */
        HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CONTROL_CLKCTRL) |=
              CM_WKUP_CONTROL_CLKCTRL_MODULEMODE_ENABLE;
    
        /* Waiting for MODULEMODE field to reflect the written value. */
        while(CM_WKUP_CONTROL_CLKCTRL_MODULEMODE_ENABLE !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CONTROL_CLKCTRL) &
               CM_WKUP_CONTROL_CLKCTRL_MODULEMODE));
    
        /* Writing to CLKTRCTRL field of CM_PER_L3S_CLKSTCTRL register. */
        HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL) |=
              CM_WKUP_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
    
        /*Waiting for CLKTRCTRL field to reflect the written value. */
        while(CM_WKUP_CLKSTCTRL_CLKTRCTRL_SW_WKUP !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL) &
               CM_WKUP_CLKSTCTRL_CLKTRCTRL));
    
        /* Writing to CLKTRCTRL field of CM_L3_AON_CLKSTCTRL register. */
        HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL) |=
              CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
    
        /*Waiting for CLKTRCTRL field to reflect the written value. */
        while(CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL_SW_WKUP !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL) &
               CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL));
    
        /* Writing to MODULEMODE field of CM_WKUP_TSC_CLKCTRL register. */
        HWREG(SOC_CM_WKUP_REGS + CM_WKUP_ADC_TSC_CLKCTRL) |=
              CM_WKUP_ADC_TSC_CLKCTRL_MODULEMODE_ENABLE;
    
        /* Waiting for MODULEMODE field to reflect the written value. */
        while(CM_WKUP_ADC_TSC_CLKCTRL_MODULEMODE_ENABLE !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_ADC_TSC_CLKCTRL) &
               CM_WKUP_ADC_TSC_CLKCTRL_MODULEMODE));
    
        /* Verifying if the other bits are set to required settings. */
    
        /*
        ** Waiting for IDLEST field in CM_WKUP_CONTROL_CLKCTRL register to attain
        ** desired value.
        */
        while((CM_WKUP_CONTROL_CLKCTRL_IDLEST_FUNC <<
               CM_WKUP_CONTROL_CLKCTRL_IDLEST_SHIFT) !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CONTROL_CLKCTRL) &
               CM_WKUP_CONTROL_CLKCTRL_IDLEST));
    
        /*
        ** Waiting for CLKACTIVITY_L3_AON_GCLK field in CM_L3_AON_CLKSTCTRL
        ** register to attain desired value.
        */
        while(CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKACTIVITY_L3_AON_GCLK !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL) &
               CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKACTIVITY_L3_AON_GCLK));
    
        /*
        ** Waiting for IDLEST field in CM_WKUP_L4WKUP_CLKCTRL register to attain
        ** desired value.
        */
        while((CM_WKUP_L4WKUP_CLKCTRL_IDLEST_FUNC <<
               CM_WKUP_L4WKUP_CLKCTRL_IDLEST_SHIFT) !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_L4WKUP_CLKCTRL) &
               CM_WKUP_L4WKUP_CLKCTRL_IDLEST));
    
        /*
        ** Waiting for CLKACTIVITY_L4_WKUP_GCLK field in CM_WKUP_CLKSTCTRL register
        ** to attain desired value.
        */
        while(CM_WKUP_CLKSTCTRL_CLKACTIVITY_L4_WKUP_GCLK !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL) &
               CM_WKUP_CLKSTCTRL_CLKACTIVITY_L4_WKUP_GCLK));
    
        /*
        ** Waiting for CLKACTIVITY_L4_WKUP_AON_GCLK field in CM_L4_WKUP_AON_CLKSTCTRL
        ** register to attain desired value.
        */
        while(CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL_CLKACTIVITY_L4_WKUP_AON_GCLK !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL) &
               CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL_CLKACTIVITY_L4_WKUP_AON_GCLK));
    
        /*
        ** Waiting for CLKACTIVITY_ADC_FCLK field in CM_WKUP_CLKSTCTRL
        ** register to attain desired value.
        */
        while(CM_WKUP_CLKSTCTRL_CLKACTIVITY_ADC_FCLK !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL) &
               CM_WKUP_CLKSTCTRL_CLKACTIVITY_ADC_FCLK));
    
        /*
        ** Waiting for IDLEST field in CM_WKUP_ADC_TSC_CLKCTRL register to attain
        ** desired value.
        */
        while((CM_WKUP_ADC_TSC_CLKCTRL_IDLEST_FUNC <<
               CM_WKUP_ADC_TSC_CLKCTRL_IDLEST_SHIFT) !=
              (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_ADC_TSC_CLKCTRL) &
               CM_WKUP_ADC_TSC_CLKCTRL_IDLEST));
    }
    
    
    unsigned int TSCADCPinMuxSetUp(void)
    {
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_AIN0) = CONTROL_CONF_AIN0_CONF_AIN0_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_AIN1) = CONTROL_CONF_AIN1_CONF_AIN1_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS +  CONTROL_CONF_AIN2)= CONTROL_CONF_AIN2_CONF_AIN2_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_AIN3) = CONTROL_CONF_AIN3_CONF_AIN3_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_AIN4) = CONTROL_CONF_AIN4_CONF_AIN4_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_AIN5) = CONTROL_CONF_AIN5_CONF_AIN5_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_AIN6) = CONTROL_CONF_AIN6_CONF_AIN6_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_AIN7) = CONTROL_CONF_AIN7_CONF_AIN7_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS + CONTROL_CONF_VREFP)= CONTROL_CONF_VREFP_CONF_VREFP_RXACTIVE;
    
        HWREG( SOC_CONTROL_REGS +  CONTROL_CONF_VREFN)= CONTROL_CONF_VREFN_CONF_VREFN_RXACTIVE;
        return TRUE;
    }
    
    static void StepConfigure(unsigned int, unsigned int, unsigned int);
    //static void ADCIsr();
    //static void CleanUpInterrupts(void);
    //int ADCInitInterrupt(Hwi_FuncPtr MainISR);
    
    volatile unsigned char flag = 1;
    Uint32 sample1;
    Uint32 sample2;
    
    Void ADCInit()
    {
    //	ADCInitInterrupt(ADCIsr);
    
        /* Enable the clock for touch screen */
        TSCADCModuleClkConfig();
    
        TSCADCPinMuxSetUp();
    
        /* Configures ADC to 3Mhz */
        TSCADCConfigureAFEClock(SOC_ADC_TSC_0_REGS, 24000000, 24000000);
    
        /* Disable Transistor bias */
        TSCADCTSTransistorConfig(SOC_ADC_TSC_0_REGS, TSCADC_TRANSISTOR_DISABLE);
    
        TSCADCStepIDTagConfig(SOC_ADC_TSC_0_REGS, 1);
    
        /* Disable Write Protection of Step Configuration regs*/
        TSCADCStepConfigProtectionDisable(SOC_ADC_TSC_0_REGS);
    
        /* Configure step 1 for channel 1(AN0)*/
        StepConfigure(0, TSCADC_FIFO_0, ADC_CHANNEL_IA);
    
        /* Configure step 2 for channel 2(AN1)*/
        StepConfigure(1, TSCADC_FIFO_0, ADC_CHANNEL_IB);
    
        /* Configure step 3 for channel 2(AN1)*/
        StepConfigure(2, TSCADC_FIFO_0, ADC_CHANNEL_VBUS);
    
        /* General purpose inputs */
        TSCADCTSModeConfig(SOC_ADC_TSC_0_REGS, TSCADC_GENERAL_PURPOSE_MODE);
    
        /* Clear the status of all interrupts */
    //    CleanUpInterrupts();
    
        /* End of sequence interrupt is enable */
    //    TSCADCEventInterruptEnable(SOC_ADC_TSC_0_REGS, TSCADC_END_OF_SEQUENCE_INT);
        TSCADCEventInterruptDisable(SOC_ADC_TSC_0_REGS, TSCADC_END_OF_SEQUENCE_INT);
    }
    
    //Void ADCRead(Uint32 *data1, Uint32 *data2)
    //{
    //    /* Enable step 1 */
    //    TSCADCConfigureStepEnable(SOC_ADC_TSC_0_REGS, 1, 1);
    //
    //    /* Enable step 2 */
    //    TSCADCConfigureStepEnable(SOC_ADC_TSC_0_REGS, 2, 1);
    //
    //	/* Enable the TSC_ADC_SS module*/
    //    TSCADCModuleStateSet(SOC_ADC_TSC_0_REGS, TSCADC_MODULE_ENABLE);
    //
    //	GPIOPinWrite(SOC_GPIO_3_REGS, 19u, 0);
    //    while(TSCADCSequencerFSMBusyStatus(SOC_ADC_TSC_0_REGS));	//1.5~1.7us
    //	GPIOPinWrite(SOC_GPIO_3_REGS, 19u, 1);
    //
    //	/* Read data from channel 1 */
    //	*data1 = TSCADCFIFOADCDataRead(SOC_ADC_TSC_0_REGS, TSCADC_FIFO_0);
    //
    //	/* Read data from channel 2*/
    //	*data2 = TSCADCFIFOADCDataRead(SOC_ADC_TSC_0_REGS, TSCADC_FIFO_0);
    //
    //
    ////    *data1 = (sample1 * 3300 / 4095);
    ////    *data2 = (sample2 * 3300 / 4095);
    //
    //    TSCADCModuleStateSet(SOC_ADC_TSC_0_REGS, TSCADC_MODULE_DISABLE);
    //}
    
    /* Configures the step */
    void StepConfigure(unsigned int stepSel, unsigned int fifo,
                       unsigned int positiveInpChannel)
    {
        /* Configure ADC to Single ended operation mode */
        TSCADCTSStepOperationModeControl(SOC_ADC_TSC_0_REGS,
                                      TSCADC_SINGLE_ENDED_OPER_MODE, stepSel);
    
        /* Configure step to select Channel, refernce voltages */
        TSCADCTSStepConfig(SOC_ADC_TSC_0_REGS, stepSel, TSCADC_NEGATIVE_REF_ADCREFM,
                        positiveInpChannel, TSCADC_NEGATIVE_INP_ADCREFM, TSCADC_POSITIVE_REF_ADCREFP);
    
        /*All off*/
        TSCADCTSStepAnalogSupplyConfig(SOC_ADC_TSC_0_REGS, TSCADC_XPPSW_PIN_OFF, TSCADC_XNPSW_PIN_OFF,
                                    TSCADC_YPPSW_PIN_OFF, stepSel);
    
        /*All off*/
        TSCADCTSStepAnalogGroundConfig(SOC_ADC_TSC_0_REGS, TSCADC_XNNSW_PIN_OFF, TSCADC_YPNSW_PIN_OFF,
                                    TSCADC_YNNSW_PIN_OFF,  TSCADC_WPNSW_PIN_OFF, stepSel);
    
        /* select fifo 0 or 1*/
        TSCADCTSStepFIFOSelConfig(SOC_ADC_TSC_0_REGS, stepSel, fifo);
    
        /* set Average */
        TSCADCTSStepAverageConfig(SOC_ADC_TSC_0_REGS, stepSel, 0);
    
        /* Configure ADC to one short mode */
        TSCADCTSStepModeConfig(SOC_ADC_TSC_0_REGS, stepSel,  TSCADC_ONE_SHOT_SOFTWARE_ENABLED);
    }
    
    ///* Clear status of all interrupts */
    //static void CleanUpInterrupts(void)
    //{
    //    TSCADCIntStatusClear(SOC_ADC_TSC_0_REGS, 0x7FF);
    //    TSCADCIntStatusClear(SOC_ADC_TSC_0_REGS ,0x7FF);
    //    TSCADCIntStatusClear(SOC_ADC_TSC_0_REGS, 0x7FF);
    //}
    //
    //int ADCInitInterrupt(Hwi_FuncPtr MainISR)
    //{
    //	Hwi_Params hwiParams;
    //	Hwi_Handle hwi0;
    //	Error_Block eb;
    //	int result = 0;
    //
    //	Hwi_Params_init(&hwiParams);
    //	Error_init(&eb);
    //
    //	//hwiParams.arg = 5;
    //	// set the event id of the peripheral assigned to this interrupt
    //	hwiParams.priority = 0x01;
    //	hwi0 = Hwi_create(SYS_INT_ADC_TSC_GENINT, MainISR, &hwiParams, &eb);
    //
    //	if (hwi0 == NULL) {
    //		System_printf("ADC Hwi_create() failed!\n");
    //		result = -1;
    //	}
    //	if (Error_check(&eb))
    //	{
    //		System_printf("ADC Hwi_create() failed!\n");
    //		result = -1;
    //	}
    //
    //	Hwi_enableInterrupt(SYS_INT_ADC_TSC_GENINT);
    //
    //	return result;
    //}
    //
    ///* Reads the data from FIFO 0 and FIFO 1 */
    //static void ADCIsr()
    //{
    //    volatile unsigned int status;
    //
    //    status = TSCADCIntStatus(SOC_ADC_TSC_0_REGS);
    //
    //    if(status & TSCADC_END_OF_SEQUENCE_INT)
    //    {
    //         /* Read data from fifo 0 */
    //         sample1 = TSCADCFIFOADCDataRead(SOC_ADC_TSC_0_REGS, TSCADC_FIFO_0);
    //
    //         /* Read data from fif 1*/
    //         sample2 = TSCADCFIFOADCDataRead(SOC_ADC_TSC_0_REGS, TSCADC_FIFO_1);
    //
    //         flag = 0;
    //    }
    //
    //    TSCADCIntStatusClear(SOC_ADC_TSC_0_REGS, status);
    //}
    

    Thank you for your support!

    Tao

  • Do I see right - from the second picture it seems that you are driving the ADC inputs from 3.3V sources. The AIN[7:0] pins must never be driven at voltages that exceed VDDA_ADC.

  • Both the driving and reference voltages are 1.8V

    Tao

  • Another issue may be the filtering capacitors on the ADC inputs.