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.

[参考译文] DRV8301:ADC 读数不工作

Guru**** 1793010 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1414887/drv8301-adc-reading-not-working

器件型号:DRV8301

工具与软件:

您好!

我对 C2000平台非常陌生、尽管我尝试通读这些示例、但我并没有成功地让简单的 ADC 读取生效。 基本上、我想打开板上的 LED11、如果 ADC 读数大于2048、这个 LED11就是 GPIO15。 ADC 读数是我的电路板上的电位器、据手册显示为 ADC-B0。 但是、Im 的读数将非常奇怪、尽管 Im 会开启电位器、但从未改变。 现在、Im 实在是太不可思议了。 遵循我的代码:

//
//包含的文件
//
#include "DSP28x_Project.h"//器件头文件和示例包含文件
#include "DSP2833x_Device.h"// F2833x 的通用器件接头
#include "DSP2833x_examples.h"//包含各种外设定义的标头

//
//函数原型
//

void InitAdc (void);
UINT16 ReadAdcResult (void);


//
// Main (主菜单)
//
void main (void)

//
//步骤1. 初始化系统控制:
// PLL、看门狗、启用外设时钟
//此示例函数位于 DSP2833x_sysctrl.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数可在 DSP2833x_GPIO.c 文件中找到、并且
//说明了如何将 GPIO 设置为默认状态。
//
// InitGpio();
InitAdc();

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
颜色;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断并显示标志
//被清除。
//此函数位于 DSP2833x_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表、即使是中断
此示例中未使用//。 这对于调试非常有用。
// shell ISR 例程可在 DSP2833x_DefaultIsr.c 中找到
//此函数可在 DSP2833x_PieVect.c 中找到
//
InitPieVectTable();

//
//步骤4. 初始化所有器件外设:
//此函数位于 DSP2833x_InitPeripherals.c 中
//
// InitPeripherals();//此示例不需要


//
//步骤5。 用户特定代码
//

//将 GPIO9配置为 Start 按钮的输入
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;// Enable pull-up on GPIO7 (在 GPIO7上启用上拉)
GpioCtrlRegs.GPADIR.bit.GPIO7 = 0;// GPIO7 =输入(停止按钮)

//将 GPIO9配置为 Start 按钮的输入
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0;// Enable pull-up on GPIO9 (启用 GPIO9上的上拉)
GpioCtrlRegs.GPADIR.bit.GPIO9 = 0;// GPIO9 = input (Start (开始)按钮)

EALLOW;//允许受保护的寄存器访问
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;//将 GPIO15设置为通用 I/O 引脚
GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;//将 GPIO15设置为输出
GpioDataRegs.GPACLEAR.bit.GPIO15 = 1;//开始时 LED 关闭
eDIS;// Disable protected register access (禁用受保护寄存器访问)


//
//启用全局中断和更高优先级的实时调试事件
//
EINT;//启用全局中断 INTM
erTM;//启用全局实时中断 DBGM

//
//主循环
//
while (1)

uint16 adcResult;

//从通道 B0读取 ADC 结果
adcResult = ReadAdcResult ();
/*
如果(GpioDataRegs.GPADAT.bit.GPIO9 = 0)//按下 Start (启动)按钮

DELAY_US (50000);//消抖延迟
如果(GpioDataRegs.GPADAT.bit.GPIO9 = 0)//在去抖后按下确认按钮

GpioDataRegs.GPASET.bit.GPIO15 = 1;// Open LED (打开 LED)
}
}
否则、如果(GpioDataRegs.GPADAT.bit.GPIO7 = 0)// Stop (停止)按钮被按下

DELAY_US (50000);//消抖延迟
如果(GpioDataRegs.GPADAT.bit.GPIO7 = 0)//在去抖后按下确认按钮

GpioDataRegs.GPACLEAR.bit.GPIO15 = 1;// Turn off LED (关闭 LED)
}
}
*/
//可选:处理 ADC 结果(用于调试或基于 ADC 的逻辑)
if (adcResult > 2048)//示例阈值检查

GpioDataRegs.GPASET.bit.GPIO15 = 1;//根据 ADC 阈值打开 LED
}

}


}

//
//此函数用于初始化通道 B0的 ADC
//
void InitAdc (void)

EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;// Enable ADC clock (启用 ADC 时钟)

//将 ADC 重置为默认状态
AdcRegs.ADCTRL1.all = 0x00E0;// Default settings (AdcRegs.ADCTRL1.all = 0x00E0;// Default settings (默认设置)
AdcRegs.ADCTRL2.all = 0x0000;// Default settings (AdcRegs.ADCTRL2.ALL = 0x0000;//默认设置)
AdcRegs.ADCTRL3.all = 0x0000;//默认设置

//配置 ADC
AdcRegs.ADCTRL1.bit.ACQ_PS = 6;// Set acquisition window size (设置采集窗口大小)
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;// Disable sequence paralling (single conversion mode)(禁用序列级联)
AdcRegs.ADCTRL1.bit.CONT_run = 0;//在一个序列后停止

//为 SOC0选择 ADC-B0 (转换开始)
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 8;// SOC0 -> ADC-B0

//设置 ADC 时钟预分频器
AdcRegs.ADCTRL3.bit.ADCCLKPS = 2;//设置 ADC 时钟预分频器

EDIS;
}

//
//从 SOC0读取 ADC 结果的函数
//
UINT16 ReadAdcResult (void)

//重置 SEQ1以确保序列从 SOC0开始
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;// Reset SEQ1 for fresh conversion

//在 SOC0 (映射到 ADC-B0)上开始转换
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;// Trigger SOC0

//等待转换完成
while (AdcRegs.ADCST.bit.INT_SEQ1 = 0);//等待转换完成

//为下一次转换清除中断标志
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

//从 ADCRESULT8读取结果(对应于 ADC-B0)
返回 AdcRegs。 ADCRESULT8;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我已经找到合适的专家、他们应该很快回复您。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [报价 userid="623616" url="~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1414887/drv8301-adc-reading-not-working 我对 C2000平台非常陌生、尽管我试图通读这些示例、但我并没有成功地通过简单的 ADC 读出才能工作。 基本上、我想打开板上的 LED11、如果 ADC 读数大于2048、这个 LED11就是 GPIO15。 ADC 读数是我的电路板上的电位器、据手册显示为 ADC-B0。 但是、Im 的读数将非常奇怪、尽管 Im 会开启电位器、但从未改变。 现在、Im 实在是太不可思议了。 遵循我的代码:

    我强烈建议您先参考一些资源、例如 C2000 Academy 实验: https://dev.ti.com/tirex/explore/node?node=A__AIKo.r4gG7gT20B.wy-wFw__C28X-ACADEMY__1sbHxUB__LATEST

    我将无法浏览这段代码、但我认为先了解我们的 ADC 实验室将是一个很好的起点。

    此外、我看到您在使用 F2833x、是否有理由不使用较新的器件?  

    此致、

    Ben Collier