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

ADS8355: 用EPWM波控制ADS8355采样

Part Number:ADS8355Other Parts Discussed in Thread: C2000WARE

想用C2000控制ADS8355采样,却采不了,能帮忙看一下程序哪里有问题嘛

#include <syscfg/board.h>

#include "driverlib.h"
#include "device.h"

//
// Defines
//
#define EPWM1_TIMER_TBPRD 2000U//设置周期位2000个时钟周期
#define EPWM1_CMPA 1000U//比较器的值为1000
volatile uint16_t sData,i;//发送的数据 // Send data buffer
volatile uint16_t r1Data[80];
volatile uint16_t r2Data[80];

//
// Function Prototypes
//
void initEPWM1(void);
__interrupt void SPIISR(void);
void configGPIOs(void);
void initSPIAMaster(void);

//
// Main
//
void main(void)
{
//
// Initialize device clock and peripherals
//
Device_init();

//
// Disable pin locks and enable internal pull ups.
//
Device_initGPIO();

//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();

//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();

//
// Assign the interrupt service routines to ePWM interrupts
//
Interrupt_register(INT_EPWM1, &SPIISR);

configGPIOs();
//
// Configure GPIO0/1 , GPIO2/3 and GPIO4/5 as ePWM1A/1B, ePWM2A/2B and
// ePWM3A/3B pins respectively
//
Board_init();

//
// Disable sync(Freeze clock to PWM as well)
//
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

initEPWM1();

//
// Enable sync and clock to PWM
//
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

//
// Enable ePWM interrupts
//
Interrupt_enable(INT_EPWM1);

//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
ERTM;
SPI_writeDataNonBlocking(SPIA_BASE, 0x00010400);//默认值
SPI_writeDataNonBlocking(SPIA_BASE, 0x00010500);//默认值
SPI_writeDataNonBlocking(SPIA_BASE, 0x00010D00);//默认值
SPI_writeDataNonBlocking(SPIA_BASE, 0x00011100);//默认值
SPI_writeDataNonBlocking(SPIA_BASE, 0x00012000);//默认值
SPI_writeDataNonBlocking(SPIA_BASE, 0x000124FF);
SPI_writeDataNonBlocking(SPIA_BASE, 0x00012501);//设置满量程
SPI_writeDataNonBlocking(SPIA_BASE, 0x000126FF);
SPI_writeDataNonBlocking(SPIA_BASE, 0x00012701);
SPI_writeDataNonBlocking(SPIA_BASE, 0x00012800);//设置测量范围
//
// IDLE loop. Just sit and loop forever (optional):
//
for(;;)
{
NOP;
}
}
void initSPIAMaster(void)
{
//
// Must put SPI into reset before configuring it
//

SPI_disableModule(SPIA_BASE);
//
// SPI configuration. Use a 500kHz SPICLK (可以达到50MHZ)and 16-bit word size.
//
SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
SPI_MODE_MASTER, 500000, 16);//DEVICE_LSPCLK_FREQ 代表50MHZ,SPI_PROT_POL0PHA0调的四种模式

SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);//设置当暂停的时候,数据还怎么传输

SPI_disableLoopback(SPIA_BASE);//跟实际通讯设备需要禁用

//
// FIFO and interrupt configuration
//
SPI_enableFIFO(SPIB_BASE);

//
// Configuration complete. Enable the module.
//
SPI_enableModule(SPIB_BASE);
SPI_enableFIFO(SPIA_BASE);//使能FIFO 口
SPI_enableModule(SPIA_BASE);//使能SPI功能
//

//

}
//
// epwm1ISR – ePWM 1 ISR
//
__interrupt void SPIISR(void)
{
//
// Update the CMPA and CMPB values
//

r1Data[i++] = SPI_readDataNonBlocking(SPIA_BASE);//第一个口收取数据
r2Data[i++] = SPI_readDataNonBlocking(SPIA_BASE);//第二个口收取数据
//
// Clear INT flag for this timer
//
EPWM_clearEventTriggerInterruptFlag(myEPWM1_BASE);//必须要

//
// Acknowledge interrupt group
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);//必须要
}

//
// initEPWM1 – Configure ePWM1
//
void initEPWM1()
{
//
// Set-up TBCLK
//
EPWM_setTimeBasePeriod(myEPWM1_BASE, EPWM1_TIMER_TBPRD);
EPWM_setPhaseShift(myEPWM1_BASE, 0U);
EPWM_setTimeBaseCounter(myEPWM1_BASE, 0U);

//
// Set Compare values
//
EPWM_setCounterCompareValue(myEPWM1_BASE,
EPWM_COUNTER_COMPARE_A,
EPWM1_CMPA);

//
// Set up counter mode
//
EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP);
EPWM_disablePhaseShiftLoad(myEPWM1_BASE);
EPWM_setClockPrescaler(myEPWM1_BASE,
EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);

//
// Set up shadowing
//
EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE,
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO);//没什么屌用,咱只用一个

//
// Set actions
//
EPWM_setActionQualifierAction(myEPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);//等于CMPA的时候又重新输出高电平
EPWM_setActionQualifierAction(myEPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);//等于0的时候开始输出低电平

//
// Interrupt where we will change the Compare Values
// Select INT on Time base counter zero event,
// Enable INT, generate INT on 3rd event
//
EPWM_setInterruptSource(myEPWM1_BASE, EPWM_INT_TBCTR_PERIOD);//时基寄存器等于1个周期的时候进行触发
EPWM_enableInterrupt(myEPWM1_BASE);//开启中断
EPWM_setInterruptEventCount(myEPWM1_BASE, 1U);//经过1次就可以触发

//
// Information this example uses to keep track of the direction the
// CMPA/CMPB values are moving, the min and max allowed values and
// a pointer to the correct ePWM registers
//

}
void configGPIOs(void)
{
//
// This test is designed for an external loopback between SPIA
// and SPIB.
// External Connections:
// -GPIO25 and GPIO17 – SPISOMI
// -GPIO24 and GPIO16 – SPISIMO
// -GPIO27 and GPIO19 – SPISTE
// -GPIO26 and GPIO18 – SPICLK
//

//
// GPIO17 is the SPISOMIA.
//
GPIO_setMasterCore(17, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_17_SPISOMIA);
GPIO_setPadConfig(17, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(17, GPIO_QUAL_ASYNC);

//
// GPIO16 is the SPISIMOA clock pin.
//
GPIO_setMasterCore(16, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_16_SPISIMOA);
GPIO_setPadConfig(16, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC);

//
// GPIO19 is the SPISTEA.
//
GPIO_setMasterCore(19, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_19_SPISTEA);
GPIO_setPadConfig(19, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC);

//
// GPIO18 is the SPICLKA.
//
GPIO_setMasterCore(18, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_18_SPICLKA);
GPIO_setPadConfig(18, GPIO_PIN_TYPE_PULLUP);//CS
GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC);

//
GPIO_setMasterCore(55, GPIO_CORE_CPU1);
GPIO_setPinConfig( GPIO_55_SPISOMIA);
GPIO_setPadConfig(55, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(55, GPIO_QUAL_ASYNC);

}

//
// initEPWM2 – Configure ePWM2
//

// updateCompare – Function to update the frequency
//

Amy Luo:

您好,

很抱歉,我这边无法验证您的代码。您现在可以对寄存器操作了吗?也就是寄存器写入后可以正确读出来?

建议您使用示波器或逻辑分析仪抓取通信波形,以检查ADC是否按期望时序运行?

如下截图所示,PD_WKEY[3:0]需要写 1001b,才能对PD_STANDBY寄存器进行寄存器写入操作:

我看您寄存器配置使用外部基准电压,但是还配置了REFDAC_A and REFDAC_B寄存器,因此,如果您软件上使用外部基准电压,那么电路上需要有外部基准电压提供。

,

MR.LIU:

您好,控制器无法运行,编译没问题,运行报错。我是用了C2000ware里面那个epwm 和spi 通信函数一起编写的,头文件是epwm 的例程,用epwm波控制spi的中断采样,先在主函数里面把寄存器配置好,然后每一次中断就给ads8355发个00000,就是不配置只发东西,tms320f28379的spi-A有好几个gpio 口,我用了两个,我想着能不能连续调用两次读取函数,把两个采样的值都给读进来,不知道可不可以。我烧写以后查看寄存器的spi的读取值全是65500,根本ads芯片就没运行,您提个建议,我这种该咋解决呢。

,

MR.LIU:

还有就是双口同时采样的问题,您的建议用28379怎么实现呢?该调用哪个函数呢。

,

MR.LIU:

XINPIAN.rar您看一下

,

MR.LIU:

我用的CCS12,TMS32028379,C2000ware 04 3

,

Amy Luo:

TMS32028379属于C2000微控制器,关于它的相关使用问题,建议您去“C2000微控制器'版块咨询,由那边的工程师为您提供帮助。

关于 ADS8355的相关问题,哪里有疑问您可以在这里回复说明

,

MR.LIU:

ADS8355片选信号可以一直开启嘛

,

Amy Luo:

不可以,具体见datasheet 7.4.1 Conversion Data Read: Dual-SDO Mode 和 7.4.2 Conversion Data Read: Single-SDO Mode 时序说明

,

MR.LIU:

 好的老师,我是用这张原理图去画的ADS8355的采样板子,这个您看下有啥大的问题嘛

,

Amy Luo:

由于论坛这几天进行维护,对您问题的回复会延迟,对您造成不便很抱歉。

,

Amy Luo:

看电路图中电路IC型号、电阻参数没有标出,仅看电路结构和接线有以下建议;

1、ADS8355 17脚 Thermal Pad 建议接地;

2、下面输入需要调换一下,因为VINM输入范围很小,一般接地:

,

MR.LIU:

谢谢老师,我现在的程序已经可以定时的自己用spia 口给spib 口收发,但就是烧到用刚刚的原理图焊接的板子上,老是有问题,有时候是在0左右上下浮动,有时候是0xffff,按原理图错误那样,是不是应该是0啊。

,

MR.LIU:

老师,我还想问一下,那个SDOA和SDOB口,是连接到一个SPI口的两个SOMI口嘛,比如说我用的是SPIA作为主机的SPi口,然后配置两个GPIO口作为SOMIA口,还是需要再用一个SPIB口。

,

Amy Luo:

MR.LIU said:但就是烧到用刚刚的原理图焊接的板子上,老是有问题,有时候是在0左右上下浮动,有时候是0xffff,按原理图错误那样,是不是应该是0啊。

如果没有按datasheet 规格输入,那么输出就不能确定是什么样的,因此建议您将输入正确连接后再做测试,看输出是怎样的?

MR.LIU said:那个SDOA和SDOB口,是连接到一个SPI口的两个SOMI口嘛,比如说我用的是SPIA作为主机的SPi口,然后配置两个GPIO口作为SOMIA口,还是需要再用一个SPIB口。

这是两种输出模式,这是需要您通过下面截图寄存器配置的,读取时序见datasheet  7.4.1和 7.4.2部分说明。

,

MR.LIU:

老师您没太理解我意思,我已经设置为两个口同时输出了,我是想问一下,这两个SDO口接到主机应该咋接,我在主机配置SPIA口作为主机的SPI口,我想问下这两个口是应该怎么连接线,是不是应该有两个GPIO口作为SPIA的SOMI口,就是芯片连到主机一共5个口,一个SPIASIMO口,两个SPIASOMI口,一个SPIASCLK口,一个CS口。

,

Amy Luo:

MR.LIU said:是不是应该有两个GPIO口作为SPIA的SOMI口,就是芯片连到主机一共5个口,一个SPIASIMO口,两个SPIASOMI口,一个SPIASCLK口,一个CS口。

是的,应该有两个GPIO口作为SPIA的SOMI口

,

MR.LIU:

老师,我现在ADS8355可以采样了,但是它有两个同步输出口,我配置了两个GPIO口作为SPISOMI口,但是按我之前那样操作始终只有一个能收到数据,比如说两个口分别为A口和B口,A口和B口都配置了,只有A口能收到数,B口单独配置,B口也能收到数了。

,

Amy Luo:

也就是说您使用的是默认SDO模式:Dual SDO mode

我不知道这种情况是您程序读取的问题,还是ADS8355 输出的问题。您在ADS8355 的输出管脚 SDO_A和 SDO_B 能同时测得输出信号吗?如果能同时测量到输出信号,那应该是程序的问题。

赞(0)
未经允许不得转载:TI中文支持网 » ADS8355: 用EPWM波控制ADS8355采样
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1