MM32与DeepSeek的融合:一场MCU与AI的奇妙碰撞!

原创 嵌入式ARM 2025-02-18 12:01
一、DeepSeek基本介绍

2025春节期间,DeepSeek火得一塌糊涂,以至于不少业内人士都在蹭它的热度。

DeepSeek是由杭州深度求索人工智能基础技术研究有限公司开发的大型语言模型,不仅性能超过ChatGPT,其运行的成本还远低于它。目前,DeepSeek提供了两种使用方式:一是通过网页在线或是APP软件进行免费对话;二是通过API开放平台与DeepSeek服务器进行对接交互。

  • DeepSeek网页版:只需打开DeepSeek官网(https://www.deepseek.com),点击开始对话,就能跳转到DeepSeek网页版(https://chat.deepseek.com)与DeepSeek进行交流了。这个是免费使用的,当前使用的人比较多,经常会出现服务器忙的提示。

  • DeepSeek API开放平台:通过DeepSeek的API开放平台,可将DeepSeek应用到我们的应用程序中,通过接口调用与DeepSeek之间完成交互;在DeepSeek在线接口文档(https://api-docs.deepseek.com/zh-cn)中阐述了当前支持的开发方式,有CURL、PYTHON、GO、NODEJS、RUBY、CSHARP、PHP、JAVA、POWERSHELL等。
    在使用DeepSeek API开发平台之前,我们需要先注册一个DeepSeek账号,然后在API开放平台中创建一个API key,这个API key就是我们通过其它开发软件连接到DeepSeek的凭证。
    通过API开放平台使用DeepSeek是收费的,收费标准是根据每百万输出tokens来计费的;对于我们想体验一下通过API开放平台来操作DeepSeek的开发人员,DeepSeep赠送了10块钱的体验优惠,前期足够我们来熟悉了掌握DeepSeek的API开放平台开发了。

下面,我们以灵动MM32为例,将其与DeepSeek融合,为你带来前所未有的交互体验!

二、MM32与DeepSeek

想要MM32 MCU与DeepSeek之间实现交互,在接口层面,我们可以使用CURL方式,通过HTTP协议与DeepSeek的API开放平台完成;在硬件层面,我们需要扩展网络模块与MM32进行连接,达到联网的功能。

这里我们使用Air724这个4G模组,与MM32之间通过串口通讯,基于AT指令来进行联网、HTTP等功能的操作。

三、硬件连接

硬件连接如下图所示,将Air724接口的RXD与Mini-F5333开发板上Arduino接口的TXD进行连接,将Air724接口的TXD与Mini-F5333开发板上Arduino接口的RXD进行连接,将Air724接口的GND与Mini-F5333开发板上Arduino接口的GND进行连接,将Air724接口的RST与Mini-F5333开发板上Arduino接口的INT进行连接;同时,给Air724模块供12V电源,给Mini-F5333开发板供5V电源。


四、功能实现

首先是基于Mini-F5333开发板创建基础工程,实现板载LED灯和KEY按键检测,通过移植MultiButton开源软件实现按键处理操作;通过AT指令操作来实现Air724模组的初始化配置,在按下按键后,实现HTTP与DeepSeek的交互;在接收到DeepSeek反馈的数据后,通过cJSON来进行解析;处理过程和解析的结果通过SWD接口打印到电脑监视软件上(这边是通过移植SEGGER_RTT来实现打印的)。

具体的代码模块如下所示:


1、基础工程配置

#include "platform.h"#include "SEGGER_RTT.h"
volatile uint32_t PLATFORM_DelayTick = 0;
void PLATFORM_InitSysTick(void){ RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks);
if (SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000)) { while (1) { } }
NVIC_SetPriority(SysTick_IRQn, 0x0);}
void PLATFORM_ConfigDelay(void){ NVIC_InitTypeDef NVIC_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStruct); TIM_TimeBaseStruct.TIM_Prescaler = (TIM_GetTIMxClock(TIM6) / 100000 - 1); TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStruct.TIM_Period = (100 - 1); TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_Div1; TIM_TimeBaseStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStruct);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM6, ENABLE);}
void PLATFORM_DelayMs(uint32_t Tick){ PLATFORM_DelayTick = Tick;
while (PLATFORM_DelayTick) { }}
void PLATFORM_InitConsole(void){ SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);}
int fputc(int ch, FILE *f){ SEGGER_RTT_PutCharSkip(0, (char)ch);
return (ch);}
void PLATFORM_PrintClocks(void){ printf("\r\nBOARD : Mini-F5333"); printf("\r\nMCU : MM32F5333D7P"); printf("\r\n");
switch (RCC->CFGR & RCC_CFGR_SWS_Msk) { case 0x00: printf("\r\nHSI used as system clock source"); break;
case 0x04: printf("\r\nHSE used as system clock source"); break;
case 0x08: if (RCC->PLL1CFGR & RCC_PLL1CFGR_PLL1SRC_Msk) { printf("\r\nPLL1 (clocked by HSE) used as system clock source"); } else { printf("\r\nPLL1 (clocked by HSI) used as system clock source"); }
break;
case 0x0C: printf("\r\nLSI used as system clock source"); break;
default: break; }
RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks);
printf("\r\n"); printf("\r\nSYSCLK Frequency : %7.3f MHz", (double)RCC_Clocks.SYSCLK_Frequency / (double)1000000.0); printf("\r\nHCLK Frequency : %7.3f MHz", (double)RCC_Clocks.HCLK_Frequency / (double)1000000.0); printf("\r\nPCLK1 Frequency : %7.3f MHz", (double)RCC_Clocks.PCLK1_Frequency / (double)1000000.0); printf("\r\nPCLK2 Frequency : %7.3f MHz", (double)RCC_Clocks.PCLK2_Frequency / (double)1000000.0); printf("\r\n");}
void PLATFORM_Init(void){ PLATFORM_InitSysTick();
PLATFORM_ConfigDelay();
PLATFORM_InitConsole();
PLATFORM_PrintClocks();}
void TIM6_IRQHandler(void){ if (RESET != TIM_GetITStatus(TIM6, TIM_IT_Update)) { if (PLATFORM_DelayTick) { PLATFORM_DelayTick--; }
TIM_ClearITPendingBit(TIM6, TIM_IT_Update); }}


2、LED驱动

#include "bsp_led.h"
void bsp_LedInit(void){ GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_10 ; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET); GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_SET); GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);}
void bsp_LedToggle(uint8_t Index){ switch (Index) { case 1: if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11) == Bit_RESET) { GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET); } else { GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_RESET); } break;
case 2: if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_10) == Bit_RESET) { GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_SET); } else { GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_RESET); } break;
case 3: if (GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7) == Bit_RESET) { GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); } else { GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET); } break;
case 4: if (GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET) { GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET); } else { GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET); } break;
default: break; }}


3、KEY驱动

#include "bsp_key.h"
void bsp_KeyInit(void){ GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStruct);}
uint8_t bsp_KeyReadPinLevel(uint8_t Index){ uint8_t PinLevel = 0;
switch (Index) { case 1: PinLevel = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4); break;
case 2: PinLevel = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5); break;
case 3: PinLevel = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1); break;
case 4: PinLevel = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2); break;
default: break; }
return (PinLevel);}


4、按键应用

#include "key.h"#include "bsp_key.h"#include "multi_button.h"
struct Button K1;struct Button K2;struct Button K3;struct Button K4;
volatile uint8_t KeyRegisterFlag = 0;volatile uint8_t KeyHttpPostFlag = 0;
void KEY_PressUpHandler(void *btn){ struct Button *handle = (struct Button *)btn;
switch (handle->button_id) { case 1: printf("\r\nK1"); break;
case 2: printf("\r\nK2"); break;
case 3: printf("\r\nK3"); break;
case 4: printf("\r\nK4"); KeyHttpPostFlag = 1; break;
default: break; }}
void KEY_Init(void){ button_init(&K1, bsp_KeyReadPinLevel, Bit_SET, 1); button_init(&K2, bsp_KeyReadPinLevel, Bit_RESET, 2); button_init(&K3, bsp_KeyReadPinLevel, Bit_RESET, 3); button_init(&K4, bsp_KeyReadPinLevel, Bit_RESET, 4);
button_attach(&K1, PRESS_UP, KEY_PressUpHandler); button_attach(&K2, PRESS_UP, KEY_PressUpHandler); button_attach(&K3, PRESS_UP, KEY_PressUpHandler); button_attach(&K4, PRESS_UP, KEY_PressUpHandler);
button_start(&K1); button_start(&K2); button_start(&K3); button_start(&K4);
KeyRegisterFlag = 1;}
void SysTick_Handler(void){ if (KeyRegisterFlag) { button_ticks(); }}


5、Air724驱动

#include "bsp_air724.h"#include "platform.h"
uint8_t Air724_RxBuffer[2048];uint16_t Air724_RxLength = 0;char deepseek_Buffer[2048];
void bsp_Air724InitUART(void){ GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; UART_InitTypeDef UART_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
UART_StructInit(&UART_InitStruct); UART_InitStruct.BaudRate = 115200; UART_InitStruct.WordLength = UART_WordLength_8b; UART_InitStruct.StopBits = UART_StopBits_1; UART_InitStruct.Parity = UART_Parity_No; UART_InitStruct.HWFlowControl = UART_HWFlowControl_None; UART_InitStruct.Mode = UART_Mode_Rx | UART_Mode_Tx; UART_Init(UART4, &UART_InitStruct);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource0, GPIO_AF_8); GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_8);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStruct);
UART_ITConfig(UART4, UART_IT_RX, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = UART4_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);
UART_Cmd(UART4, ENABLE);}
void bsp_Air724RxIrqHandler(uint8_t Data){ printf("%c", Data);
Air724_RxBuffer[Air724_RxLength] = Data;
Air724_RxLength += 1; Air724_RxLength %= 2048;}
void bsp_Air724InitGPIO(void){ GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOI, ENABLE);
GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIO_WriteBit(GPIOI, GPIO_Pin_0, Bit_SET);}
void bsp_Air724Reset(void){ GPIO_WriteBit(GPIOI, GPIO_Pin_0, Bit_SET); PLATFORM_DelayMs(100);
GPIO_WriteBit(GPIOI, GPIO_Pin_0, Bit_RESET); PLATFORM_DelayMs(100);}
void bsp_Air724ClearRxBuffer(void){ Air724_RxLength = 0;
for (uint16_t i = 0; i < 2048; i++) { Air724_RxBuffer[i] = 0; }}
void bsp_Air724Init(void){ bsp_Air724InitUART();
bsp_Air724InitGPIO();
bsp_Air724ClearRxBuffer();}
void bsp_Air724SendData(uint8_t Data){ UART_SendData(UART4, Data);
while (RESET == UART_GetFlagStatus(UART4, UART_FLAG_TXC)) { }}
uint32_t bsp_Air724SendCommandBlocking(char *Command, char *Response, uint32_t Timeout){ if (Command != NULL) { while (*Command != '\0') { bsp_Air724SendData(*Command++); }
bsp_Air724SendData(0x0D); bsp_Air724SendData(0x0A); }
if (Timeout != 0) { bsp_Air724ClearRxBuffer();
while (Timeout--) { if (strstr((char *)Air724_RxBuffer, Response) != NULL) { return (Timeout); }
PLATFORM_DelayMs(1); } }
return (0);}
void bsp_Air724InputDataNonBlocking(char *Data){ if (Data != NULL) { while (*Data != '\0') { bsp_Air724SendData(*Data++); }
bsp_Air724SendData(0x1A); }}


6、HTTP初始化

void HTTP_Init(void){    bsp_Air724Reset();
bsp_Air724SendCommandBlocking(NULL, "RDY", 10000); bsp_Air724SendCommandBlocking(NULL, "+NITZ", 10000);
PLATFORM_DelayMs(500);
bsp_Air724SendCommandBlocking("AT", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CPIN?", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CGATT?", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=3,1,\"APN\",\"\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=1,1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+SAPBR=2,1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CGNSPWR=1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CSQ", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+CGNSAID=31,1,1,1", "OK", 10000);}


7、HTTP与DeepSeek交互

char POST_DATA[] = "{\    \"model\": \"deepseek-chat\",\    \"messages\": [{\"role\": \"user\", \"content\": \"who are you?\"}],\    \"stream\": false\}";
void HTTP_Post(void){ char Command[200];
bsp_Air724SendCommandBlocking("AT+HTTPINIT", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPSSL=1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"CID\",1", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"URL\",\"https://api.deepseek.com/chat/completions\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"CONTENT\",\"application/json\"", "OK", 10000);
bsp_Air724SendCommandBlocking("AT+HTTPPARA=\"USERDATA\",\"Authorization:Bearer API key\"", "OK", 10000);
memset(Command, 0, sizeof(Command)); sprintf(Command, "AT+HTTPDATA=%d,10000", strlen(POST_DATA));
bsp_Air724SendCommandBlocking(Command, "DOWNLOAD", 30000);
printf("\r\n%s", POST_DATA);
bsp_Air724InputDataNonBlocking(POST_DATA);
bsp_Air724SendCommandBlocking("AT+HTTPACTION=1", "OK", 30000);
bsp_Air724SendCommandBlocking(NULL, "+HTTPACTION: 1,200,", 30000);
bsp_Air724SendCommandBlocking("AT+HTTPREAD", "OK", 30000);
bsp_Air724RxHandler();
bsp_Air724SendCommandBlocking("AT+HTTPTERM", "OK", 10000);}


8、DeepSeek数据处理

#include "cJSON.h"
void bsp_Air724RxHandler(void){ uint16_t Count = 0; uint16_t Group = 0;
memset(deepseek_Buffer, 0, sizeof(deepseek_Buffer));
for (uint16_t i = 0; i < Air724_RxLength; i++) { if (Air724_RxBuffer[i] == '{') { Group++; }
if (Group) { deepseek_Buffer[Count++] = Air724_RxBuffer[i]; }
if (Air724_RxBuffer[i] == '}') { if(Group) Group--; } }
printf("\r\n--------------------------------------------------------------------------------");
cJSON *cjson = cJSON_Parse(deepseek_Buffer);
char *json_data = cJSON_Print(cjson);
if (cjson == NULL) { printf("\r\ncjson error!!!"); } else { printf("\r\n%s", json_data); }
printf("\r\n--------------------------------------------------------------------------------");
printf("\r\n");}


五、运行结果

MCU向DeepSeek发送了“who are you?”的提问,如下图所示,DeepSeek进行了回答“I’m an AI language model created by OpenAI……”


六、附件


好了,以上就是今天分享的所有内容了,如果有需要下载原图、代码,以及更多内容的小伙伴,请点击底部“阅读原文”进行查看

END

本文系21ic论坛网友xld0932原创,如需转载,请注明出处。


推荐阅读
盘点我常用的嵌入式开发工具
有人用DeepSeek写了一个串口助手,然后...
传稚辉君开设分公司,高薪招聘嵌入式开发!

→点关注,不迷路←

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
  • 一、芯片概述:功能与应用场景WTR096录音语音芯片,是一款高性价比、低功耗的语音处理解决方案,专为需要灵活录音与播放功能的智能设备设计。其核心优势在于支持多段录音、内置存储扩展、外挂Flash适配,可广泛应用于智能玩具、家用电器(如语音闹钟、门铃)、工业设备提示器、安防告警系统等领域。二、核心参数与技术特性1. 多段录音能力:灵活应对场景需求WTR096支持最大10段独立录音,用户可通过指令或按键切换不同录音片段。例如:智能门锁可分别录制“欢迎回家”“密码错误”等多段提示音;工业设备可分段存储
    广州唯创电子 2025-05-16 09:04 107浏览
  • 公司简介:致力于解析非结构化数据的 AI 企业Cinnamon AI 是一家全球性的人工智能技术公司,核心产品聚焦于处理非结构化数据,如电子邮件、语音记录和视频内容。他们提供的 AI 平台,能够帮助客户从海量数据中提取有价值的信息,提升业务效率。项目挑战:多云部署下的 CI/CD 持续优化难题在实际开发中,Cinnamon AI 面临以下几大挑战:需同时支持 AWS、Google Cloud Platform 和 Azure 等多个云平台,以及内部部署版本;希望持续缩短开发周期,提高产品更新频率
    艾体宝IT 2025-05-16 09:31 99浏览
  • 公司简介:Ping Identity 是谁?Ping Identity 是全球领先的身份与访问管理(IAM)解决方案提供商,致力于帮助企业安全管理用户身份、控制应用和资源的访问权。作为行业先驱,Ping Identity 的客户遍布全球,其产品广泛应用于金融、医疗、政府等对安全要求极高的行业。然而,作为一家技术驱动型企业,他们同样面临来自软件供应链的安全挑战,特别是在广泛采用开源组件的背景下,如何实现自动化安全管理、降低法律风险并保障客户数据的安全,成为企业可持续发展的关键。挑战:如何保障应用安
    艾体宝IT 2025-05-16 09:35 114浏览
  •   全球仿真软件开发代表性企业解析(按领域分类)   仿真软件开发领域覆盖多行业与技术方向,以下按领域梳理国内外具有代表性的企业及其核心特点:   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在仿真软件,教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   
    华盛恒辉l58ll334744 2025-05-16 10:37 100浏览
  • 在现代影像技术的快速发展下,动态范围(Dynamic Range)成为评估影像质量的重要指针之一。无论是无人机在高空拍摄的画面、工作用相机在不同光线条件下的成像表现、还是随身记录仪在运动过程中的稳定录像,「动态范围」的数值高低直接影响画面的清晰度与细节还原能力。然而,拍摄环境中的极端条件,如耀眼的阳光、深沉的阴影或快速变化的光线,都对产品的影像拍摄提出了严峻的挑战。技术难题:不同环境下对影像设备的质量影响本次分享一家网络监控摄影机(Network Cameras) 制造厂商,经常收到客诉提到:在
    百佳泰测试实验室 2025-05-16 14:43 120浏览
  •   仿真软件开发领域代表性企业概览   在仿真软件开发领域,众多企业以技术特色与行业深耕为核心竞争力,形成差异化布局。以下梳理国内外代表性企业及其核心业务方向:   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。
    华盛恒辉l58ll334744 2025-05-16 10:51 105浏览
  • FM(RDS) 与 DAB 是车用音响领域常见的两种广播接收方式。随着科技的进步,DAB 作为数字音频传输的代表,逐渐受到更多关注。FM(RDS)属于传统的调频广播,透过调变载波的频率来传送声音讯号。RDS(Radio Data System) 则是FM广播的一种辅助技术,可以在FM讯号中夹带额外的文字信息,例如电台名称、节目类型、交通讯息等。DAB(Digital Audio Broadcasting)数字音频传输(DAB)是透过数字化处理广播音频讯号的传输,音质较 FM 清晰,此外,除了一般
    百佳泰测试实验室 2025-05-16 11:06 126浏览
  • PT100温度传感器凭借其高精度(±0.1℃级)和宽温域(-200℃~850℃)特性,广泛应用于以下核心场景:‌一、工业过程控制‌1、‌化工与石油‌l 监测反应釜温度(-200℃~850℃),通过PID算法调控加热/冷却系统,提升化学反应效率与**性。l 原油输送管道中采用浸入式铠装设计(316L不锈钢套管),实现-50℃~300℃范围的黏度与温度联动控制。2、‌电力设备‌l 监测变压器绕组表面温度(≤180℃),结合光纤绝缘层预防热老化故障。l 发电机冷
    锦正茂科技 2025-05-15 13:02 186浏览
  • 2025 年 5 月 16 日讯,英伟达首席执行官黄仁勋的专机于北京时间 13:29 抵达中国台北松山机场,其此行引起了广泛关注。黄仁勋此番赴台,主要是为了参加即将于 5 月 20 日至 23 日举行的台北电脑展(Computex 2025),他将在 19 日上午进行主题演讲。此次演讲备受期待,市场猜测其可能会宣布英伟达与富士康、广达等中国台湾地区 AI 服务器公司达成的更多合作,进一步推动 AI 技术的发展和应用。此外,据市场消息,黄仁勋将于 17 日邀请供应链伙伴聚餐,鸿海董事长刘扬伟、纬创
    鲜橙财经 2025-05-16 14:00 132浏览
  •   全球仿真软件头部企业核心实力与行业地位解析   仿真软件行业的竞争格局随技术迭代和市场需求动态演变,以下从技术优势、行业应用等维度,梳理全球范围内具备标杆意义的企业:   1. 华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP
    华盛恒辉l58ll334744 2025-05-16 11:37 113浏览
  • 泰克的PA3000 Power Analyzer是长这个样子的,如下图。开机界面等待几秒,进入这样的界面,如下图。设置通道的范围,界面的显示参数,采样模式,电流接口的霍尔采样比例等等,按键如下图。后面是这样的,有电压和电流接入口,详细可以阅读相关的机器使用手册(在官网下载),如下图。拆开上面的机盖,可以清晰的看到里面的部件,如下图。并联接入电压口,额定要求600V1A,串联接入电流口,额定要求有1A,30A,还有接入电流霍尔采集器的口,采集更大的电流需要,如下图。FUSE F1AH 600V是电
    liweicheng 2025-05-15 23:54 103浏览
  • 一、引言:录音语音芯片的广泛应用录音语音芯片凭借高集成度、低功耗和灵活的扩展性,广泛应用于智能家居、工业设备、玩具、安防系统等领域。此类芯片支持录音、存储及播放功能,但在实际应用中,用户可能遇到录音后播放无声音的问题。本文将从技术原理、常见故障及解决方案展开解析。二、录音语音芯片的工作原理语音芯片的核心流程分为三个阶段:录音与编码:通过麦克风采集音频信号,芯片将其转化为数字信号并压缩存储。存储介质:部分型号支持内置存储,而复杂场景(如长时录音)需外挂Flash芯片扩展容量。播放控制:通过UART
    广州唯创电子 2025-05-16 08:41 107浏览
  •   全球仿真软件头部企业核心能力与选型指南   仿真软件行业的领先企业因技术路径和行业聚焦不同形成多元格局,以下从技术能力、市场地位及行业适配性角度,解析全球范围内具有标杆意义的代表性企业:   华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽
    华盛恒辉l58ll334744 2025-05-16 11:13 120浏览
  •   北京仿真软件开发代表性企业解析   北京作为国内仿真技术创新高地,集聚多家深耕细分领域的领先企业,其技术布局与行业适配性各具特色。以下为核心企业的优势解析及选型参考:   一、华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,
    华盛恒辉l58ll334744 2025-05-16 16:00 125浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦