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

LAUNCHXL-F280039C: 无法烧录程序

阅读(48)

Part Number:LAUNCHXL-F280039C

Hi E2E,

我们在使用LAUNCHXL-F280039C的过程中,突然发现它无法烧录程序了。

我们采用的是工具是XDS110,提示如下:

请问这是什么原因引起的?我们应该怎么处理它?

Thanks

Lydia:

您好,

请参考这个资源并通过搜索您的报错代码“Error -2131”了解可能的原因,software-dl.ti.com/…/ccs_debugging_jtag_connectivity_issues.html

TMS320F280049C: IIC在向EEprom芯片写入数据的时候出现STT一直置1,重新采用IIC初始化配置后还是无法解决问题

阅读(42)

Part Number:TMS320F280049C

借鉴官方例程向Eeprom当中发送指令的形式。官方例程中先置位STT,再置位STP。

撰写了一个批量非阻塞函数,该功能根据需要写入的字节数先判断是否跨页,如果跨页便分多次写,在判断每次写入的数据是否会超过FIFO长度。如果超过FIFO那么就会在进行拆分。

假设需要写入100个数据,页大小为32,那么函数自动分4次页写,在看页写入大小是否超过FIFO,如果超过便拆为多次FIFO写。且每次FIFO写都会有5ms的等待时间。

但是在实际使用过程中发现本次需要写入1000个数据,调用该函数则有概率出现STT一直置1,IIC初始化配置后,在执行函数还是为出现STT一直置1。

经过检查发现在执行先置位STT,再置位STP代码前将ADC中断关闭,执行代码完后在开启ADC中断,该情况不在出现。

另其它几种解决方案:

1、由官方的先置位STT,再置位STP改为先置位STP,再置位STT。

2、由官方的先置位STT,再置位STP改为先置位STP,再将数据全部发在FIFO后才置位STT。

3、向该函数传递的长度为10,则情况不出现。

一直无法解释该现象原因。现在求助给大佬给一个思路。

Lydia:

您好,

感谢您对TI产品的关注!为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上(https://e2e.ti.com/p/addpost),将由资深的英文论坛工程师为您提供帮助。

TMS320F280045: 关于用C2000-GANG批量烧录280045DSP问题

xiaochao wei阅读(41)

Part Number:TMS320F280045

我们在烧录280045DSP过程中,发现用没有DCSM的hex文件烧录可以成功,但是当带上DCSM后,生成hex后显示烧录成功,但实际上DSP里面应该是程序跑飞了。

请问有什么原因会造成这种现象?

Lydia:

您好,

感谢您对TI产品的关注!为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上(https://e2e.ti.com/p/addpost),将由资深的英文论坛工程师为您提供帮助。

TMS320F280039C: 关于pbist中的D2(Down 2)算法其具体说明在哪里?

阅读(61)

Part Number:TMS320F280039COther Parts Discussed in Thread:C2000WARE

文件路径:C:\ti\c2000\C2000Ware_5_01_00_00\libraries\boot_rom\f28003x\rev0\rom_sources\F28003x_ROM\bootROM\include\cpu1brom_pbist.h

说明:该处出现了D2(Down 2)算法,因此询问一下是否有该算法的说明文档。

补充:在 C2000Tm Memory Power-On Self-Test (M-POST)  中只能看到March13n算法,里面有没关于D2算法的描述。

?? ?:

滴滴滴滴滴滴,有人回复吗?

TMS320F280039C: tms320f280039 ePWM global load for multi channels or many register in one channel

changqing ZHU阅读(62)

Part Number:TMS320F280039C

请教下

ePWM global load , 是针对多个寄存器在一个通道里同步更新, 还是 多个通道里的寄存器可以同步更新

changqing ZHU:

Can ePWM global load used for updated registers for multi channel s at same time

for example , update ePWM1 duty and ePWM2 duty at same time ; to avoid issue of CNT == 0 occurs between update ePWM1 duty and update epwm2 duty?

,

Daniel:

您好

针对TMS320F280039C的ePWM(增强型脉冲宽度调制器)global load功能,它是设计用来同步更新多个ePWM模块的寄存器值的。不过,具体是多个寄存器在一个通道里同步更新,还是多个通道里的寄存器可以同步更新,这取决于global load的配置和使用方式。

在TMS320F280039C的ePWM模块中,global load通常与特定的同步事件(如SYNC事件)相关联。当这个同步事件发生时,所有配置了global load的ePWM模块会根据预设的值来更新它们的寄存器。

‌单个通道内的多个寄存器‌:在单个ePWM通道内,global load可以配置为同步更新该通道内的多个寄存器,例如比较寄存器(CMPA/CMPB)、周期寄存器(TBPRD)等。这意味着,当global load触发时,这些寄存器会同时被更新为新的值。

‌多个通道间的寄存器‌:此外,global load还可以跨多个ePWM通道进行配置,以实现跨通道的寄存器同步更新。这意味着,当global load触发时,不仅单个通道内的寄存器会更新,而且多个通道中相应配置的寄存器也会同时更新。

因此,TMS320F280039C的ePWM global load功能既支持单个通道内多个寄存器的同步更新,也支持多个通道间寄存器的同步更新。具体实现方式取决于你的配置需求和使用场景。

TMS320F28379D: USB JTAG链接后寄存器显示Error:Unable to read

阅读(42)

Part Number:TMS320F28379D

各位开发人员:

我在使用TMS320F28379D芯片的官方开发板(C200 LaunchPad XL)进行USB测试(使用官方例程),使用JTAG链接开发板进行Debug操作。不管是连接完成状态还是程序已经开始运行状态,USB模块中的一些寄存器始终显示Error:Unable to read 。例如:USBEPIDX寄存器,USBDEVCTL寄存器等。请问遇到这种情况需要怎么解决?

Alice:

您好,

      下面帖子讨论了类似问题,请参考其建议更新一下.xml文件

     TMS320F28379D: The USB Register Registers window is not readable – C2000 microcontrollers forum – C2000Tm︎ microcontrollers – TI E2E support forums

TMS320F28377S: 求一个tms320F28377S的串口iap的demo,我看论坛上有人在官网找到过。

hhhh阅读(63)

Part Number:TMS320F28377SOther Parts Discussed in Thread: C2000WARE

求一个tms320F28377S的串口iap的demo,我看论坛上有人在官网找到过。

e2echina.ti.com/…/f021-api-flash-while-fapi_get_fsm_status-fapi_status_success

Vivian Gao:

您好

您具体指的是哪个demo?

,

hhhh:

串口iap的demo,使用串口给内部flash升级程序的

,

Vivian Gao:

您好

没有找到特别直接的例程,TI目前的例程还是以C2000WARE里面的为主。

e2e.ti.com/…/ccs-tms320f28335-tms320f28335-iap-example-project

TMS320F28388D: 在通信过程中有粘包现象,通信一段时间后会断开连接

Gao Tian阅读(50)

Part Number:TMS320F28388DOther Parts Discussed in Thread:TMDSCNCD28388D

您好,我使用TI的开发板TMDSCNCD28388D测试网络通信时出现两个问题:

一是 连续发送数据时会有粘包现象

二是 通信一段时间后会断开连接

下面是实验代码:

(1)CM上的主程序和http处理程序

int
main(void)
{unsigned long ulUser0, ulUser1;unsigned char pucMACArray[8];//// User specific IP Address Configuration.// Current implementation works with Static IP address only.//unsigned long IPAddr = 0xC0A80101;unsigned long NetMask = 0xFFFFFF00;unsigned long GWAddr = 0x00000000;// Initializing the CM. Loading the required functions to SRAM.CM_init();SYSTICK_setPeriod(systickPeriodValue);SYSTICK_enableCounter();SYSTICK_registerInterruptHandler(SysTickIntHandler);SYSTICK_enableInterrupt();//// Enable processor interrupts.//Interrupt_enableInProcessor();// Set user/company specific MAC octets// (for this code we are using A8-63-F2-00-00-80)// 0x00 MACOCT3 MACOCT2 MACOCT1ulUser0 = 0x00F263A8;// 0x00 MACOCT6 MACOCT5 MACOCT4ulUser1 = 0x00800000;//// Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC// address needed to program the hardware registers, then program the MAC// address into the Ethernet Controller registers.//pucMACArray[0] = ((ulUser0 >>  0) & 0xff);pucMACArray[1] = ((ulUser0 >>  8) & 0xff);pucMACArray[2] = ((ulUser0 >> 16) & 0xff);pucMACArray[3] = ((ulUser1 >>  0) & 0xff);pucMACArray[4] = ((ulUser1 >>  8) & 0xff);pucMACArray[5] = ((ulUser1 >> 16) & 0xff);//// Initialize ethernet module.//Ethernet_init(pucMACArray);//// Initialze the lwIP library, using DHCP.//lwIPInit(0, pucMACArray, IPAddr, NetMask, GWAddr, IPADDR_USE_STATIC);//// Initialize the HTTP webserver daemon.//httpd_init();IPC_clearFlagLtoR(IPC_CM_L_CPU1_R, IPC_FLAG_ALL);IPC_sync(IPC_CM_L_CPU1_R, IPC_FLAG31);  // 等待远端IPC初始化//// Loop forever. All the work is done in interrupt handlers.//while(1);
}

static err_t
http_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
{struct http_state *hs = (struct http_state *)arg;char *data = NULL;if(err==ERR_OK && p!=NULL){tcp_recved(pcb,p->tot_len);data = p->payload;pbuf_free(p);if(data[0]=='A' && data[1]=='O'){tcp_write(pcb,"led1  open",10, 1);GPIO_writePin(DEVICE_GPIO_PIN_LED1, 0);}else if(data[0]=='A' && data[1]=='C'){tcp_write(pcb,"led1 close",10, 1);GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);}if(data[0]=='B' && data[1]=='O'){tcp_write(pcb,"led2  open",10, 1);GPIO_writePin(DEVICE_GPIO_PIN_LED2, 0);}else if(data[0]=='B' && data[1]=='C'){tcp_write(pcb,"led2 close",10, 1);GPIO_writePin(DEVICE_GPIO_PIN_LED2, 1);}else if(data[0]=='P' && data[1]=='L'){tcp_write(pcb,"TESTOK",10, 1);}}else{pbuf_free(p);}if(err==ERR_OK && p==NULL){http_close_conn(pcb,hs);}return ERR_OK;

}

(2)CPU1上的主程序

void main(void)
{//// Initialize device clock and peripherals//Device_init();//// Boot CM core//
#ifdef _FLASHDevice_bootCM(BOOTMODE_BOOT_TO_FLASH_SECTOR0);
#elseDevice_bootCM(BOOTMODE_BOOT_TO_S0RAM);
#endif//// Disable pin locks and enable internal pull-ups.//Device_initGPIO();GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(DEVICE_GPIO_PIN_LED2, GPIO_PIN_TYPE_STD);GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED2, GPIO_DIR_MODE_OUT);GPIO_setMasterCore(31, GPIO_CORE_CM);GPIO_setMasterCore(34, GPIO_CORE_CM);

#ifdef ETHERNET//// Set up EnetCLK to use SYSPLL as the clock source and set the// clock divider to 2.//// This way we ensure that the PTP clock is 100 MHz. Note that this value// is not automatically/dynamically known to the CM core and hence it needs// to be made available to the CM side code beforehand.SysCtl_setEnetClk(SYSCTL_ENETCLKOUT_DIV_2, SYSCTL_SOURCE_SYSPLL);//// Configure the GPIOs for ETHERNET.////// MDIO Signals//GPIO_setPinConfig(GPIO_105_ENET_MDIO_CLK);GPIO_setPinConfig(GPIO_106_ENET_MDIO_DATA);//// Use this only for RMII Mode//GPIO_setPinConfig(GPIO_73_ENET_RMII_CLK);//////MII Signals//GPIO_setPinConfig(GPIO_109_ENET_MII_CRS);GPIO_setPinConfig(GPIO_110_ENET_MII_COL);GPIO_setPinConfig(GPIO_75_ENET_MII_TX_DATA0);GPIO_setPinConfig(GPIO_122_ENET_MII_TX_DATA1);GPIO_setPinConfig(GPIO_123_ENET_MII_TX_DATA2);GPIO_setPinConfig(GPIO_124_ENET_MII_TX_DATA3);////Use this only if the TX Error pin has to be connected//GPIO_setPinConfig(GPIO_46_ENET_MII_TX_ERR);//GPIO_setPinConfig(GPIO_118_ENET_MII_TX_EN);GPIO_setPinConfig(GPIO_114_ENET_MII_RX_DATA0);GPIO_setPinConfig(GPIO_115_ENET_MII_RX_DATA1);GPIO_setPinConfig(GPIO_116_ENET_MII_RX_DATA2);GPIO_setPinConfig(GPIO_117_ENET_MII_RX_DATA3);GPIO_setPinConfig(GPIO_113_ENET_MII_RX_ERR);GPIO_setPinConfig(GPIO_112_ENET_MII_RX_DV);GPIO_setPinConfig(GPIO_44_ENET_MII_TX_CLK);GPIO_setPinConfig(GPIO_111_ENET_MII_RX_CLK);////Power down pin to bring the external PHY out of Power down//GPIO_setDirectionMode(108, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(108, GPIO_PIN_TYPE_PULLUP);GPIO_writePin(108,1);////PHY Reset Pin to be driven High to bring external PHY out of Reset//GPIO_setDirectionMode(119, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(119, GPIO_PIN_TYPE_PULLUP);GPIO_writePin(119,1);
#endif
}

(3)上位机的连接和发送接收函数

#include "DLL_28388.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#include <iostream>
#include<winSock2.h>
#include<WS2tcpip.h>
#define WIN32_LEAN_AND_MEAN
#include<windows.h>
#pragma comment(lib,"ws2_32.lib")



SOCKET CDll::F28388D_Lwip_Connect(const std::string& ipAddress, int port)
{
	// 初始化Winsock
	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != 0) {
		return INVALID_SOCKET;
	}

	// 创建SOCKET
	SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (ConnectSocket == INVALID_SOCKET) {
		WSACleanup();
		return INVALID_SOCKET;
	}

	// 设置服务器地址
	sockaddr_in serverAddress;
	serverAddress.sin_family = AF_INET;
	serverAddress.sin_port = htons(port);

	// 将IP地址从字符串转换为二进制形式
	in_addr addr;
	if (inet_pton(AF_INET, ipAddress.c_str(), &addr) <= 0) {
		closesocket(ConnectSocket);
		WSACleanup();
		return INVALID_SOCKET;
	}
	serverAddress.sin_addr = addr;

	// 连接到服务器
	iResult = connect(ConnectSocket, (SOCKADDR*)&serverAddress, sizeof(serverAddress));
	if (iResult == SOCKET_ERROR) {
		closesocket(ConnectSocket);
		WSACleanup();
		return INVALID_SOCKET;
	}

	return ConnectSocket; // 返回已连接的socket句柄
}

int CDll::F28388D_Lwip_Send(SOCKET sock, const std::string& msg)
{
	int bytesSent = send(sock, msg.c_str(), static_cast<int>(msg.size()), 0);
	if (bytesSent == SOCKET_ERROR) {
		std::cerr << "send failed with error: " << WSAGetLastError() << std::endl;
		return 1;
	}
	return 0;
}

std::string CDll::F28388D_Lwip_Recv(SOCKET sock) {
	char recvbuf[512];
	int bytesRecvd = recv(sock, recvbuf, sizeof(recvbuf) - 1, 0);
	if (bytesRecvd > 0) {
		recvbuf[bytesRecvd] = '\0'; // 确保字符串以null终止
		return std::string(recvbuf);
	}
	else if (bytesRecvd == 0) {
		std::cout << "Connection closed" << std::endl;
	}
	else {
		std::cerr << "recv failed with error: " << WSAGetLastError() << std::endl;
	}
	return "";
}

在wireshark软件中,显示的粘包错误:

AC命令对应返回值为led1 close

BC命令对应返回值为led2 close

AO命令对应返回值为led1 open

BO命令对应返回值为led2 open

在上位机程序的定时器中,这些命令分开 依次 发送,但是抓包数据显示,有三个命令是放到一个TCP数据包中发送出去的,请问这可能是什么原因造成的

Gao Tian:

dsptest_lwip.rar这是我的工程文件,希望各位大佬和TI的工程师们能够下载运行一下,如果有问题或者好的解决方案,希望我们可以详细探讨交流一下,不胜感激!

TMS320F28379D: PWM的同步SYNC信号与PWM的相对位置对不上

jing980814阅读(65)

Part Number:TMS320F28379D

专家好,我想请教下,我在测试EPWM1的同步SYNC信号输出和pwm的相对位置关系时发现有点奇怪

我设置了SYNC信号在计数器等于0时输出信号(通过XBAR配置为GPIO输出,用于示波器查看)

PWM设置为上下模式、上升沿低电平+下降沿高电平。PWM比较寄存器仅在周期进行加载

理论上波形应该是SYNC信号处在PWM波形的高电平中点位置,但示波器上看对不上,想请教下是为什么呢?

Freedom:

代码贴上来看看。

,

Daniel:

您好

针对你提到的TMS320F28379D的EPWM1的SYNC信号输出和PWM相对位置关系的问题,这里有几个可能的原因和检查点,希望能帮助你解决问题:

‌SYNC信号和PWM时钟的关系‌:

确保SYNC信号确实是在计数器等于0时输出。虽然你通过XBAR配置为GPIO输出用于示波器查看,但还是要确认这个配置是否生效,以及是否有其他因素(如延迟)影响了SYNC信号的实际输出时间。
检查PWM的时钟源设置,确保PWM的时钟与SYNC信号的时钟是一致的。不一致的时钟源可能会导致两者之间的相位关系发生变化。

‌PWM比较寄存器的加载时机‌:

你提到PWM比较寄存器仅在周期进行加载。请确认这个加载时机是否与SYNC信号的输出时机相协调。如果加载时机不当,可能会导致PWM波形与SYNC信号之间的相对位置关系出现偏差。

‌PWM的模式和极性设置‌:

你将PWM设置为上下模式、上升沿低电平+下降沿高电平。请确认这些设置是否正确,并且与你的预期相符。错误的模式或极性设置可能会导致PWM波形与SYNC信号之间的相对位置关系不正确。

‌硬件电路的影响‌:

检查与EPWM1相关的硬件电路,包括输出电路、滤波电路等,确保它们没有引入额外的延迟或相位偏移。

‌示波器的设置和校准‌:

确认示波器的设置是否正确,包括触发源、时间基准、电压量程等。错误的示波器设置可能会导致观察到的波形与实际波形不一致。
如果可能的话,使用另一台示波器或测试设备进行验证,以排除示波器本身的问题。

‌软件代码和配置‌:

仔细检查与EPWM1相关的软件代码和配置,确保没有遗漏或错误。特别是与SYNC信号和PWM波形相关的配置和代码。

https://dev.ti.com/tirex/explore/node?node=A__AAzO2oxis8w7tFwC-JEaJA__motor_control_c2000ware_sdk_software_package__0.jXikd__LATEST

https://dev.ti.com/tirex/explore/node?node=A__AHZ5a4K.FJu1TjJGe1Pj3Q__C2000WARE__1kRFgrO__LATEST

以上是官方的相关例程。

,

jing980814:

PWM的相关配置如下:EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);EPWM_setTimeBasePeriod(EPWM1_BASE, INV_PWM_PERIOD);EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);EPWM_disablePhaseShiftLoad(EPWM1_BASE);EPWM_setPhaseShift(EPWM1_BASE, 0U);EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);// Set up shadowingEPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);// Set Compare valuesEPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0);// Set actionsEPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);// Set dead-band - Use EPWMA as the input for both RED and FEDEPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);// Set dead-band - Set the RED and FED valuesEPWM_setFallingEdgeDelayCount(EPWM1_BASE, INV_PWM_DB);EPWM_setRisingEdgeDelayCount(EPWM1_BASE, INV_PWM_DB);// Set dead-band - Do not invert the delayed outputs (AH)EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);// Set dead-band - Use the delayed signals instead of the original signals//EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true);//EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true);EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, false);EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, false);//Set Initialize StateEPWM_setActionQualifierContSWForceAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_OUTPUT_LOW);EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);EPWM_setActionQualifierContSWForceShadowMode(EPWM1_BASE, EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO_PERIOD);SYNC的配置如下SysCtl_setSyncOutputConfig(SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT);XBAR_setOutputMuxConfig(XBAR_OUTPUT1, XBAR_OUT_MUX14_EXTSYNCOUT);XBAR_enableOutputMux(XBAR_OUTPUT1, XBAR_MUX14);XBAR_invertOutputSignal(XBAR_OUTPUT1, TRUE);GPIO_setPinConfig(GPIO_58_OUTPUTXBAR1);

,

jing980814:

你好,EPWM的配置都通过寄存器挨个检查了,应该是没问题

因为绝大部分时候pwm的频率都能对得上,只是中间突然有一个异常的

,

Daniel:

您好

根据您的描述,请减少外部信号干扰和电路板硬件布局优化来解决您的问题。

,

jing980814:

感谢您的回复。

我测量的是DSP直接输出引脚的电平,具体软件配置如上,现象倒是很稳定

您看是否是我在配置上有遗漏等原因呢?感觉还是想软件哪里配置上有问题,但反复对比并挨个检查了寄存器,未发现异常

,

Daniel:

您好

关于软件配置请参考给您分享的相关例程结合TRM来对应一下

https://www.ti.com.cn/cn/lit/ug/spruhm8k/spruhm8k.pdf?ts=1729229874727&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Fproduct%252Fcn%252FTMS320F28379D

因为具体功能具体寄存器进行配置,请您按照上述资料进行匹配。

TMS320F280049C: ADC数值跳动

cuizhuangping阅读(44)

Part Number:TMS320F280049COther Parts Discussed in Thread:LAUNCHXL-F280049C,

使用官方的LAUNCHXL-F280049C开发板,跑adc_ex1_soc_software例程验证ADC采样的问题顶,我在while(1)循环中把最后的ESTOP0屏蔽,然后在线调试,观察myADC0Result0的数值变化,给开发板的A0通道接入了信号源,给1V,发现转换结果在1200-1300之间跳变,数据很不准确,想问下是什么原因?

cuizhuangping:

//#############################################################################
//
// FILE:adc_ex1_soc_software.c
//
// TITLE:ADC Software Triggering
//
//! \addtogroup driver_example_list
//! <h1>ADC Software Triggering</h1>
//!
//! This example converts some voltages on ADCA and ADCC based on a software
//! trigger.
//!
//! The ADCC will not convert until ADCA is complete, so the ADCs will not run
//! asynchronously. However, this is much less efficient than allowing the ADCs
//! to convert synchronously in parallel (for example, by using an ePWM//! trigger).
//!
//! \b External \b Connections \n
//!- A0, A1, C2, and C3 should be connected to signals to convert
//!
//! \b Watch \b Variables \n
//! - \b myADC0Result0 - Digital representation of the voltage on pin A0
//! - \b myADC0Result1 - Digital representation of the voltage on pin A1
//! - \b myADC1Result0 - Digital representation of the voltage on pin C2
//! - \b myADC1Result1 - Digital representation of the voltage on pin C3
//!
//
//#############################################################################
//
//
// $Copyright:
// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions// are met:
////Redistributions of source code must retain the above copyright//notice, this list of conditions and the following disclaimer.
////Redistributions in binary form must reproduce the above copyright
//notice, this list of conditions and the following disclaimer in the//documentation and/or other materials provided with the//distribution.
////Neither the name of Texas Instruments Incorporated nor the names of
//its contributors may be used to endorse or promote products derived
//from this software without specific prior written permission.
//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//#############################################################################
////
// Included Files
//
#include "driverlib.h"
#include "device.h"
#include "board.h"//
// Globals
//
uint16_t myADC0Result0;
uint16_t myADC0Result1;
uint16_t myADC1Result0;
uint16_t myADC1Result1;//
// Main
//
void main(void)
{//// Initialize device clock and peripherals//Device_init();//// Disable pin locks and enable internal pullups.//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();//// Set up ADCs, initializing the SOCs to be triggered by software//Board_init();//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop indefinitely//while(1){//// Convert, wait for completion, and store results//ADC_forceMultipleSOC(myADC0_BASE, (ADC_FORCE_SOC0 | ADC_FORCE_SOC1));//// Wait for ADCA to complete, then acknowledge flag//while(ADC_getInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1) == false){}ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1);ADC_forceMultipleSOC(myADC1_BASE, (ADC_FORCE_SOC0 | ADC_FORCE_SOC1));//// Wait for ADCC to complete, then acknowledge flag//while(ADC_getInterruptStatus(myADC1_BASE, ADC_INT_NUMBER1) == false){}ADC_clearInterruptStatus(myADC1_BASE, ADC_INT_NUMBER1);//// Store results//myADC0Result0 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);myADC0Result1 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1);myADC1Result0 = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0);myADC1Result1 = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER1);DEVICE_DELAY_US(100);//// Software breakpoint. At this point, conversion results are stored in// myADC0Result0, myADC0Result1, myADC1Result0, and myADC1Result1.//// Hit run again to get updated conversions.////ESTOP0;}
}

,

Daniel:

您好

这里有几个可能的原因和解决方案供你参考:

‌参考电压和分辨率问题‌:

F280049C的ADC模块通常有一个固定的参考电压(如Vref),并且具有固定的分辨率(如12位或16位)。你需要确认你的ADC配置是否正确设置了参考电压和分辨率。
如果参考电压是3.3V(或你实际使用的电压值),那么1V的输入应该对应一个特定的ADC计数值。例如,如果分辨率是12位,那么理论上1V应该对应大约1V / 3.3V * 4096(假设参考电压为3.3V且分辨率为12位)的计数值,即约1241。

‌信号源和输入通道问题‌:

确认你的信号源是否稳定且准确地输出了1V的电压。
检查开发板上的A0通道是否连接正确,没有短路或断路的情况。

‌ADC校准和偏移‌:

ADC模块可能需要校准来消除偏移和增益误差。检查你的代码中是否包含了ADC校准的步骤。
如果没有,你可以尝试进行ADC校准,看看是否能改善采样结果的准确性。

‌噪声和干扰‌:

外部噪声或电源波动可能会干扰ADC的采样结果。尝试使用屏蔽电缆或增加滤波电路来减少噪声的影响。
检查开发板的电源是否稳定,以及是否有其他潜在的干扰源。

‌代码和配置问题‌:

仔细检查你的代码,确保ADC的配置(如采样率、触发源等)是正确的。
确认你的代码中没有其他逻辑错误或配置错误,这些错误可能会影响ADC的采样结果。

为了更具体地诊断问题,你可以尝试以下步骤:

使用示波器或万用表检查信号源的输出电压是否稳定且准确。
在开发板上使用其他ADC通道进行采样,看看是否仍然存在同样的问题。
尝试使用不同的参考电压设置,看看采样结果是否有所变化。
检查并更新你的ADC校准参数。

,

cuizhuangping:

非常感谢您的解答,我这边情况是这样的,设计了一款基于TMS320F280049C的电源板,ADC这边数值跳动很大,大约波动有100左右,相对于12位ADC波动达到了2.5%,所以就回过头去看官方的开发板,发现用开发板跑官方例程,用信号源直接给信号的形式波动也比较大,今天又试了将模拟输入引脚短接到开发板的地和VREFHI,波动会小一点,但是也达到了10左右,相当于12位ad只能做到9位左右稳定度,想问下,这个片内的AD理论上能做到多高的稳定度,先不谈精度了?

,

Daniel:

您好

1. 电源稳定性

‌影响‌:电源噪声会直接影响ADC的采样精度和稳定度。
‌优化方法‌:使用高质量的电源滤波器,确保电源线路的稳定和干净。同时,将ADC的模拟电源(VDDA)和模拟地(VSSA)分别连接到单独的、干净的电源和地,以减少数字电路对模拟电路的干扰。

2. 参考电压稳定性

‌影响‌:参考电压的波动会导致ADC转换结果的偏移和不稳定。
‌优化方法‌:使用稳定的参考电压源,并确保参考电压线路的稳定和干净。如果可能,可以使用外部精密参考电压源来提高稳定度。

3. 输入信号质量

‌影响‌:输入信号的噪声和干扰会影响ADC的采样结果。
‌优化方法‌:在ADC输入端添加适当的滤波电路,以减少高频噪声的干扰。同时,确保输入信号在ADC的输入范围内,并避免过压或欠压情况。

4. ADC配置和校准

‌影响‌:ADC的配置参数(如采样速度、分辨率、输入衰减等)和校准状态会影响其稳定度。
‌优化方法‌:根据实际应用需求,合理配置ADC的参数。同时,定期进行ADC校准,以消除内部电容器组变化带来的误差。校准过程中,需要确保ADC处于断电状态,并按照校准时序图进行操作。

5. 时钟稳定性

‌影响‌:ADC时钟的稳定性和精度会影响其采样结果的准确性和稳定度。
‌优化方法‌:为ADC提供稳定且精确的时钟源。可以使用专用的可编程预分频器来调整ADC时钟的频率,以满足实际应用需求。

6. 环境和布局因素

‌影响‌:环境温度、湿度以及PCB布局和布线等因素也会对ADC的稳定度产生影响。
‌优化方法‌:将ADC模块放置在温度稳定且湿度适中的环境中。同时,在PCB布局时,确保ADC相关的信号线路尽可能短且远离高噪声区域。此外,还可以采取适当的屏蔽措施来减少外部干扰。

这是影响单片机内部ADC稳定的相关因素,建议您通过上述建议优化。

,

cuizhuangping:

非常感谢宝贵建议

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