TI中文支持网
TI专业的中文技术问题搜集分享网站

关于DSP2812例程BLDC3_1中adc04u模块的一些疑问

各位大佬们好:

        我的问题如下:1、#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)

                                 这个句子中我知道DELAY_US是居于RAM实现的1us延时,但是我不是很理解DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)这句是怎么来的,看了些帖子说是汇编语言中定义的,也不是很理解。

                                  2、F281X_adc04u_drv_read中DatQ15 = (AdcRegs.ADCRESULT0>>1)&0x7FFF;我知道这句是把结果装换成Q15格式单极性数据,可是为什么ADCRESULT0要右移一位,又为什么要&0x7FFF呢?而下一句Tmp = (int32)p->Ch1Gain*(int32)DatQ15;又为什么要把tmp转成Q28呢,再下一句 p->Ch1Out = (int16)(Tmp>>13);吧ch1out转成Q15,这中间有什么联系呢。

                                 感谢大佬们的回答!!!(下面是adc04u的程序)

#include "DSP281x_Device.h"
#include "f281xadc04u.h"
#define CPU_CLOCK_SPEED      6.6667L   // for a 150MHz CPU clock speed
#define ADC_usDELAY 5000L
#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)
extern void DSP28x_usDelay(unsigned long Count);
void F281X_adc04u_drv_init(ADCVALS *p)
{
    DELAY_US(ADC_usDELAY); 
     AdcRegs.ADCTRL1.all = ADC_RESET_FLAG;   // Reset the ADC Module   asm(" NOP ");
 asm(" NOP ");   
    AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;  // Power up bandgap/reference circuitry ##############################为bandgap参考电路供电##################################
 DELAY_US(ADC_usDELAY);         // Delay before powering up rest of ADC ##############################为ADC其他单元上电延迟###################################
       AdcRegs.ADCTRL3.bit.ADCPWDN = 1;      // Power up rest of ADC
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 6;       // Set up ADCTRL3 register DELAY_US(ADC_usDELAY); 
    AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE_UNIPOLAR; // Set up ADCTRL1 register    AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE_UNIPOLAR;  // Set up ADCTRL2 register AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3;               // Specify four conversions ################################设置通道选择######################################
    AdcRegs.ADCCHSELSEQ1.all = p->ChSelect;           // Configure channel selection
 EvaRegs.GPTCONA.bit.T1TOADC = 1;                // Set up EV Trigger with Timer1 UF#########################设置采用UF触发ADC转换,下溢中断启动ADC############################
void F281X_adc04u_drv_read(ADCVALS *p)
{
       int16 DatQ15;
       int32 Tmp;
        // Wait until ADC conversion is completed              ##############等待ADC转换结束#######################################
        while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)         //#####################这儿ADCST与头文件定义的ADC_ST_FLAG好像有点名字对不上可能得把名字改成一样###################//
        {};
        DatQ15 = (AdcRegs.ADCRESULT0>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)############################转换结果为Q15格式单极性数据##########################
        Tmp = (int32)p->Ch1Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch1Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        DatQ15 = (AdcRegs.ADCRESULT1>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)
        Tmp = (int32)p->Ch2Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch2Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        DatQ15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)
        Tmp = (int32)p->Ch3Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch3Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        DatQ15 = (AdcRegs.ADCRESULT3>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)
        Tmp = (int32)p->Ch4Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch4Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        AdcRegs.ADCTRL2.all |= 0x4040;            // Reset the sequence

Green Deng:我的理解:ADC转换结果为16位数据,根据数据类型,带符号数据类型中高一位代表符号,这里的首位符号不确定,但程序需要单极性数据,如果直接将首位取0或取1,则会丢失一位数据。故先右移一位空出一个符号位,得到1位符号位+15位有效位。右移之后符号位的数未知,可能为0也可能为1。0x7FFF转换为二进制是0111 1111 1111 1111,在这种情况下做&操作,首位符号位始终是0,使数值变为单极性。
其后两句语句的理解可以参考帖子:e2echina.ti.com/…/90598

各位大佬们好:

        我的问题如下:1、#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)

                                 这个句子中我知道DELAY_US是居于RAM实现的1us延时,但是我不是很理解DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)这句是怎么来的,看了些帖子说是汇编语言中定义的,也不是很理解。

                                  2、F281X_adc04u_drv_read中DatQ15 = (AdcRegs.ADCRESULT0>>1)&0x7FFF;我知道这句是把结果装换成Q15格式单极性数据,可是为什么ADCRESULT0要右移一位,又为什么要&0x7FFF呢?而下一句Tmp = (int32)p->Ch1Gain*(int32)DatQ15;又为什么要把tmp转成Q28呢,再下一句 p->Ch1Out = (int16)(Tmp>>13);吧ch1out转成Q15,这中间有什么联系呢。

                                 感谢大佬们的回答!!!(下面是adc04u的程序)

#include "DSP281x_Device.h"
#include "f281xadc04u.h"
#define CPU_CLOCK_SPEED      6.6667L   // for a 150MHz CPU clock speed
#define ADC_usDELAY 5000L
#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)
extern void DSP28x_usDelay(unsigned long Count);
void F281X_adc04u_drv_init(ADCVALS *p)
{
    DELAY_US(ADC_usDELAY); 
     AdcRegs.ADCTRL1.all = ADC_RESET_FLAG;   // Reset the ADC Module   asm(" NOP ");
 asm(" NOP ");   
    AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;  // Power up bandgap/reference circuitry ##############################为bandgap参考电路供电##################################
 DELAY_US(ADC_usDELAY);         // Delay before powering up rest of ADC ##############################为ADC其他单元上电延迟###################################
       AdcRegs.ADCTRL3.bit.ADCPWDN = 1;      // Power up rest of ADC
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 6;       // Set up ADCTRL3 register DELAY_US(ADC_usDELAY); 
    AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE_UNIPOLAR; // Set up ADCTRL1 register    AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE_UNIPOLAR;  // Set up ADCTRL2 register AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3;               // Specify four conversions ################################设置通道选择######################################
    AdcRegs.ADCCHSELSEQ1.all = p->ChSelect;           // Configure channel selection
 EvaRegs.GPTCONA.bit.T1TOADC = 1;                // Set up EV Trigger with Timer1 UF#########################设置采用UF触发ADC转换,下溢中断启动ADC############################
void F281X_adc04u_drv_read(ADCVALS *p)
{
       int16 DatQ15;
       int32 Tmp;
        // Wait until ADC conversion is completed              ##############等待ADC转换结束#######################################
        while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)         //#####################这儿ADCST与头文件定义的ADC_ST_FLAG好像有点名字对不上可能得把名字改成一样###################//
        {};
        DatQ15 = (AdcRegs.ADCRESULT0>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)############################转换结果为Q15格式单极性数据##########################
        Tmp = (int32)p->Ch1Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch1Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        DatQ15 = (AdcRegs.ADCRESULT1>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)
        Tmp = (int32)p->Ch2Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch2Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        DatQ15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)
        Tmp = (int32)p->Ch3Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch3Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        DatQ15 = (AdcRegs.ADCRESULT3>>1)&0x7FFF;    // Convert raw result to Q15 (unipolar signal)
        Tmp = (int32)p->Ch4Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch4Out = (int16)(Tmp>>13);               // Convert Q28 to Q15
        AdcRegs.ADCTRL2.all |= 0x4040;            // Reset the sequence

user6007383:

回复 Green Deng:

十分感谢您的解答

赞(0)
未经允许不得转载:TI中文支持网 » 关于DSP2812例程BLDC3_1中adc04u模块的一些疑问
分享到: 更多 (0)