各位大佬们好:
我的问题如下: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 "f281xadc04u.h"
#define ADC_usDELAY 5000L
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)
{
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; // Reset the ADC Module asm(" NOP ");
asm(" NOP ");
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.ADCCHSELSEQ1.all = p->ChSelect; // Configure channel selection
}
{
int16 DatQ15;
int32 Tmp;
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1) //#####################这儿ADCST与头文件定义的ADC_ST_FLAG好像有点名字对不上可能得把名字改成一样###################//
{};
Tmp = (int32)p->Ch1Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch1Out = (int16)(Tmp>>13); // Convert Q28 to Q15
Tmp = (int32)p->Ch2Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch2Out = (int16)(Tmp>>13); // Convert Q28 to Q15
Tmp = (int32)p->Ch3Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch3Out = (int16)(Tmp>>13); // Convert Q28 to Q15
Tmp = (int32)p->Ch4Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch4Out = (int16)(Tmp>>13); // Convert Q28 to Q15
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 "f281xadc04u.h"
#define ADC_usDELAY 5000L
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) – 9.0L) / 5.0L)
{
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; // Reset the ADC Module asm(" NOP ");
asm(" NOP ");
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.ADCCHSELSEQ1.all = p->ChSelect; // Configure channel selection
}
{
int16 DatQ15;
int32 Tmp;
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1) //#####################这儿ADCST与头文件定义的ADC_ST_FLAG好像有点名字对不上可能得把名字改成一样###################//
{};
Tmp = (int32)p->Ch1Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch1Out = (int16)(Tmp>>13); // Convert Q28 to Q15
Tmp = (int32)p->Ch2Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch2Out = (int16)(Tmp>>13); // Convert Q28 to Q15
Tmp = (int32)p->Ch3Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch3Out = (int16)(Tmp>>13); // Convert Q28 to Q15
Tmp = (int32)p->Ch4Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch4Out = (int16)(Tmp>>13); // Convert Q28 to Q15
user6007383:
回复 Green Deng:
十分感谢您的解答