尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

低成本MCU上的NTC测温实战:九齐NY8B062E与OTP开发踩坑记录

低成本MCU上的NTC测温实战:九齐NY8B062E与OTP开发踩坑记录 第一次在NYIDE里点下烧录按钮看着进度条走完紧接着发现芯片没反应的时候我就知道这个坑踩实了。那是一次九齐单片机项目用的芯片是NY8B062E需要加一路NTC温度检测。062E是一颗OTP芯片烧进去就擦不掉程序有问题只能换片重来。那一片芯片几块钱成本不高但来回折腾的时间是真的肉疼。说实话九齐单片机的开发环境NYIDE是我用过最不“现代”的IDE之一界面老、资料散、坑还特别多。但产品价格压在那里小家电上用STM32、用合泰都算贵九齐这种几毛钱一颗的OTP单片机反而最合适。尤其是NTC温度检测这种功能062E自带ADC模块外接一个10k NTC和一颗固定电阻就能搞定大部分测温场景。这篇文章把从NYIDE环境搭建到NTC测温实现整个流程整理出来重点是我踩过的坑和最终能直接用的方案给后面接九齐、用062E做温度项目的朋友做个参考。1. 项目全貌与技术选型思路1.1 为什么最后选了九齐062E先说选型。这个项目是给一个低成本小家电做温度保护要求很简单实时检测发热体温度超过阈值就切断控制同时用一个IO口输出状态。整机BOM成本卡得非常死MCU部分预算就在一两块钱以内而且不需要复杂通信一两路ADC加几个GPIO就够了。当时对比过几颗料合泰HT66F002PIC系列的OTP型号还有九齐NY8B062E。合泰IDE和烧录器也要单独搭PIC在代理商那边货源不太好排价格也没优势。九齐062E的优势在于资源刚好够用自带ADC供货稳定开发工具门槛低官网就能下IDE。最关键的是单价确实低老板那关好过。062E的资源属于典型的“麻雀虽小五脏俱全”OTP程序空间只有2K级别RAM更是以字节为单位来数没记错的话就是一百多个字节。这种资源玩不了花活但做NTC测温、IO控制这类简单逻辑完全够。它内部有独立ADC模块这个在同类低价OTP里算良心配置。要知道不少同价位芯片只有比较器没有ADCNTC测温就得外挂运放或者换方案成本立刻就上去了。不过便宜是有代价的。OTP意味着只能烧一次开发和调试容错率极低程序没想清楚就不能随便写片。加上NYIDE这个IDE本身就有一堆莫名其妙的习惯新手入门很容易在环境阶段就劝退。这也是我这篇文章想重点解决的问题把从安装到烧录的每一步踩坑点都列出来让你少走弯路。1.2 NTC测温方案的总体设计整体方案不复杂就是经典的分压采样结构一颗10k固定电阻和一颗10k NTC串联在电源和地之间ADC采样点取在两者中间通过采样电压反推NTC阻值再查对应温度表得到温度值。这里先交代一下电路接法。我用的接法是固定电阻接VDDNTC在下端接地ADC输入接在固定电阻和NTC的公共端。这样温度升高时NTC阻值下降分压点电压也下降ADC读数变小方向比较直观后续软件处理不容易搞混。ADC、查表算法和输出控制都在062E内部完成。显示端只用了两个普通IO接LED一个表示正常一个表示超温报警。如果产品需要数码管或串口输出也可以在剩余IO上扩展但纯软件模拟串口在资源紧张的芯片上会额外占不少ROM我这个项目里没这么做。选择查表法而不是直接在芯片里用B值公式在线计算原因很现实062E是8位机没有硬件浮点单元指数和对数运算靠库函数做的话一个式子可能几千个cycle就没了程序空间也扛不住。查表加线性插值几十条指令就完成一次换算精度控制在1℃以内对温度保护场景完全够用。这个方案是整个项目最核心的设计取舍后面会详细展开。2. NYIDE开发环境搭建新手最容易卡住的一关2.1 安装与环境配置路径、权限、杀毒软件NYIDE这玩意儿的安装逻辑放到今天来看确实反人类。我第一次安装完打开IDE直接提示缺少组件编译按钮点了没反应折腾了半天才发现是安装路径和杀毒软件双重问题。先说路径。NYIDE对安装路径非常敏感路径里一旦有中文或者空格编译的时候很容易出现找不到头文件、链接器报错这类诡异问题。建议直接装在盘符根目录比如“D:\NYIDE”这种纯净路径。工程路径同理一定要全英文。我当时图省事建了一个叫“温度检测”的文件夹结果编译时报了不下五种错误最后把路径改成英文全家桶才消停。再说权限。NYIDE在Win10以上系统里默认权限下经常出现写配置文件失败、License验证不通过这类问题。解决办法很简单右键图标选择“以管理员身份运行”。如果你嫌每次麻烦可以右键属性在兼容性选项卡里勾选“以管理员身份运行此程序”。这步做完很多权限相关的玄学问题当场消失。最后是杀毒软件。九齐的IDE和烧录器驱动都带底层驱动和COM组件有些杀毒软件会把这些文件当风险程序直接隔离导致IDE打开就闪退或者烧录器连不上。装环境之前先把杀毒软件关了装完再把NYIDE目录和驱动目录加入白名单。这不是让各位裸奔而是这种小众IDE确实容易被误报加白名单是最省事的处理方式。2.2 License申请与激活我见过的激活失败原因NYIDE安装完还不能直接用需要从官网申请License。流程倒是简单准备一个常用邮箱按申请页面填写电脑信息然后等邮件回复。但这个环节有几个坑要注意。第一是申请页面建议用浏览器翻译别凭感觉填。有些字段填写不规范系统审核会直接打回来回折腾至少一两天。第二是官方邮件可能会被邮箱系统丢进垃圾箱等了两三天没收到先别急着重新提交先去垃圾箱翻一翻。收到邮件之后把激活码复制粘贴到IDE的注册窗口。这里不要手动打字输入激活码里面有大写字母、数字、横杠手打特别容易把0和O、1和I搞混。我碰到过一次激活失败排查到最后就是激活码里一个字符打错了纯属低级错误。还有个注意点License通常和电脑硬件信息绑定申请的时候填的机器信息必须和实际使用的电脑一致。如果你在办公室电脑申请回家想在笔记本上用大概率激活不了。绑定信息一般是网卡MAC地址或者主板序列号建议申请前先在IDE的注册界面里查看系统读取到的机器码复制下来填到申请页面这样成功率最高。2.3 新建工程与芯片型号选择先选对芯片再写代码NYIDE新建工程的入口在一个叫“Project”的菜单里新建之后第一件事就是选择芯片型号。这一步千万别跳我见过有人建完工程不选型号直接写代码编译的时候报错报得完全看不懂。在设备选择界面里找到NY8B062E这一项选中确认。选对型号后IDE会自动加载对应的头文件和链接脚本后续编译、生成烧录文件才会用对参数。如果选错型号比如选了同系列的其它芯片轻则编译警告重则烧录后运行异常而且因为OTP不可擦除这一片芯片就直接废了。接下来是工程配置重点看两个地方时钟源和优化等级。062E支持外部晶振和内部RCNTC测温对时序精度要求不高直接用内部RC就能满足这样可以省下外部晶振成本。不过要留意芯片数据手册里内部RC的具体校准范围有些芯片出厂误差能达到百分之一到百分之三如果项目有精确计时需求就不太够用了。优化等级在项目属性里设置。OTP芯片程序空间紧张尽量打开代码优化的选项能省一点是一点。但优化等级开太高有时会影响代码执行时序尤其是有延时函数的时候。建议先不开优化写完功能最后烧录前再看剩余空间不够了再逐步提升优化等级别一上来就开最高。源文件的添加也需要在工程窗口里操作右键点击源文件组选择“添加新文件”。这里有个容易忽略的地方新建的C文件在保存时编码格式尽量用ANSI否则在代码里写中文注释重新打开IDE后可能变成乱码。这个不影响编译但影响日后维护建议一开始就注意。2.4 烧录器连接与驱动解决“烧录器无响应”环境配置好代码写完到了烧录环节又是另一个问题集中爆发的阶段。九齐烧录器连上电脑后首先要检查设备管理器里是否正常识别。如果看到一个带黄色感叹号的未知设备那就是驱动没装好。驱动安装不要用IDE安装包默认装完就拉倒。把烧录器插到电脑上打开设备管理器右键未知设备选择“更新驱动程序”手动定位到NYIDE安装目录下的驱动文件夹强制指定搜索路径。安装过程中如果提示“驱动签名验证失败”在高级启动选项里选择“禁用驱动程序强制签名”然后再装一次。Win10和Win11这个选项藏得比较深弯路走多了就熟练了。烧录器的物理连接同样不能马虎。九齐烧录器和目标板之间一般需要接电源、地、时钟、数据这几根线按烧录器丝印对应连接。这里最容易出问题的是电源烧录器输出3.3V还是5V必须和目标板实际的系统电压一致否则芯片可能会进入异常状态导致烧录失败。另外线序一定看清CLK和DAT接反是最常见的烧录失败原因没有之一。如果接线正确、驱动正常还是提示“找不到设备”或者“Target MCU error”检查目标芯片是否放反。用烧录座的话芯片的缺口标识要和座上丝印对应放反了轻则识别不了重则烧录瞬间损伤芯片。我第一片烧废的062E就是放反了硬烧教训非常深刻。3. NTC温度检测的硬件设计与采样原理3.1 分压电路设计电阻位置和阻值都不能乱NTC测温硬件部分看着简单就一颗电阻加一颗NTC但细节决定精度。先确定RT表。我用的NTC是10k阻值、B值3950的常用规格25℃时标称阻值就是10kB值描述的是阻值随温度变化的斜率。这个规格在某宝上遍地都是物料好买价格便宜数据也齐项目选它最省心。前面定了固定电阻放在上端接VDDNTC放在下端接地采样点在中间。分压公式写出来就是V_adc VDD * R_ntc / (R_fixed R_ntc)固定电阻为什么选10k而不是1k、100k这需要算。NTC在25℃时是10k如果固定电阻也选10k25℃时分压点正好是VDD的一半ADC读数落在中段动态范围利用得最充分。同时VDD按3.3V算流过电阻和NTC的电流大约是3.3V / 20k ≈ 165uA这个电流在NTC上产生的自热功率只有P I² * R ≈ 0.027mW对测温精度影响可以忽略。如果选1k固定电阻电流直接跳到330uA以上NTC自热会让读数偏高好几度这个误差在25℃附近尤其明显。当然电阻精度也很重要。固定电阻建议用1%精度温漂尽量小。这类电阻成本就多几分钱但是ADC读数和最终温度偏差都能稳稳压住。用5%的电阻最坏情况下温度误差能到2℃以上对于有温度保护逻辑的产品来说这个风险不值得省。另外提醒一下NTC两端建议并联一个100nF到470nF的电容作为RC低通滤波滤掉电源和走线上耦合进来的高频干扰。这个电容不影响低频温度信号但对ADC采样稳定性帮助很大。单片机内部ADC输入阻抗有限如果不加滤波电容采样值可能因为引脚电容充放电不完全而出现明显跳动。3.2 用B值公式估算温度-阻值关系NTC的阻值随温度呈指数规律变化工程上常用B值公式来计算R(T) R25 * exp( B * (1/T - 1/T25) )这里面R25是25℃时阻值B是B值T和T25都是开尔文温度。这个公式是从NTC材料的热敏特性推导出来的经验公式B值标称3950的情况下在-20℃到80℃范围内能有不错的拟合精度做温度保护够用了。手算几个点大家感受一下。25℃是基准R 10k。0℃时T 273.15K代入公式算出R约为33.6k。50℃时T 323.15KR大约3.6k。可以发现NTC在低温区间阻值变化非常剧烈高温区间则变缓这是NTC的固有特性。后面做ADC映射表时这个非线性会导致温度越高ADC分辨率越低选型时要留意测量范围。有一点要特别说明B值公式是近似不是绝对精确。不同厂家、不同批次NTC的B值会有差异25℃阻值也有误差常见为1%或5%。如果产品对温度精度要求很高就必须做整机标定用标准温度计在多个温度点实际测出来修正查表数据。我这边做的是高温保护逻辑阈值设定在45℃左右查表法得到的误差完全可接受。3.3 ADC值与温度映射表怎么生成有了温度-阻值关系结合分压电路就能算出对应ADC值。这里有个前提062E的ADC是12位分辨率也就是满量程4095参考电压选择VDD分压电路的供电也用VDD。这样ADC值和分压比直接对应VDD波动理论上不会影响读数因为参考电压和分压供电是同源的这是很多硬件工程师容易忽略的小技巧。计算式为ADC_value 4095 * V_adc / VDD 4095 * R_ntc / (R_fixed R_ntc)以10k NTC、B3950、固定电阻10k为例理论ADC值如下表温度(℃)NTC阻值(kΩ)分压点电压(VDD3.3V时)ADC读数(12bit)033.62.54V31581020.22.21V27392012.51.83V2278308.01.47V1824405.31.14V1416503.60.87V1082602.50.66V816这张表不用手工算用Excel拉公式最方便。先输入0到100℃的整数温度算对应阻值再算ADC值生成一张完整表。然后按自己需要的温度范围取点一般表间隔取10℃数据量小RAM压力小插值精度也够。如果低于0℃或者高于100℃是产品需要的边界范围就把表扩大比如-10℃到110℃。生成表的时候有个方向问题温度升高NTC阻值减小ADC读数也减小所以从低温到高温ADC值是递减的。做查表算法时代码里要么倒序存储要么在查找逻辑里处理方向很多人在这个细节上写反导致温度跳变到离谱值甚至负温度。3.4 062E的ADC配置要点062E的ADC配置在数据手册里写得比较隐晦寄存器就那么几个但要配对才能真正工作。我这里只讲核心逻辑具体寄存器位名以你自己拿到的头文件为准因为九齐芯片的头文件在不同版本IDE里寄存器命名可能有差异照抄网络上的代码不一定能编过。首先是参考电压和转换时钟。参考电压选VDD和分压电路同源保证比率测量不受电源波动影响。ADC转换时钟不能太快太快的话采样电容充电时间不足低位数不稳定建议分频到几十kHz到几百kHz这个范围。如果你用的是内部RC 8MHz系统时钟ADC分频系数选大一点更稳妥。其次是采样通道选择。062E的ADC输入通道通常可以配置NTC接在哪个引脚就选择对应通道。通道切换后不要立刻启动转换要留几个微秒的稳定时间否则上一通道的电荷残留会影响当前通道读数。这个在代码里加一个空循环延时就行几百个NOP的事。最后是多点采样取平均。我在实际项目里是连续采8次去掉最大最小值剩下6次求平均。这个操作能有效抑制随机噪声和电网工频干扰代价只是几十微秒处理时间在温度检测这种低频场景下非常划算。如果采样值仍然跳动明显去查硬件滤波电容和地线走线大概率是那个问题。4. 从零写代码主循环、查表插值与烧录验证4.1 主流程与端口初始化整体代码逻辑很简洁初始化系统时钟和IO口循环里做ADC采样、查表换算、阈值判断、LED输出。需要注意的一点是062E的IO初始化最好先设成输入还是输出再操作电平避免上电瞬间IO口误动作。控制外部功率器件的话建议加一个开机延时或IO状态确认防止复位瞬间输出异常虽然这不是本次温度检测的核心但产品化时必须考虑。初始化代码示意如下#include NY8B062E.h #define LED_NORMAL_PIN (1 1) #define LED_ALARM_PIN (1 2) #define ALARM_TEMP_0_1C (450) // 45.0℃超温阈值 void GPIO_Init(void) { // 伪代码将LED引脚设置为输出模式 // IOSTB ~(LED_NORMAL_PIN | LED_ALARM_PIN); // PORTB ~(LED_NORMAL_PIN | LED_ALARM_PIN); }这里的寄存器操作我故意写成注释性质的伪代码因为不同版本IDE头文件的宏定义名称有出入读者直接看自己的数据手册配一遍IO方向寄存器是最稳的。4.2 ADC读取函数连续采样加防跳变ADC读取函数的核心是“等待转换完成”这个机制。启动转换后用循环等待标志位置位读到结果后清标志。注意不要在主循环里做长时间的阻塞等待否则系统实时性会被拖垮但温度检测场景本身不要求毫秒级响应所以简单阻塞读取完全能接受。连续采样8次去极值平均的代码逻辑如下unsigned short Read_NTC_ADC(void) { unsigned short raw[8]; unsigned char i; unsigned short min_val 4095; unsigned short max_val 0; unsigned long sum 0; for (i 0; i 8; i) { // 伪代码选择NTC所在ADC通道 // ADCON 0xF8, ADCON | 0x00; // 延时一小段让引脚稳定 // 启动ADC转换等待完成读取12位结果到raw[i] } for (i 0; i 8; i) { if (raw[i] min_val) min_val raw[i]; if (raw[i] max_val) max_val raw[i]; } for (i 0; i 8; i) { if (raw[i] ! min_val raw[i] ! max_val) sum raw[i]; } return (unsigned short)(sum / 6); }去极值平均的思路很简单如果某一次采样受到干扰导致数值异常偏大或偏小把它带进平均值里会让最终结果明显偏移。温度检测本身不需要太高的响应速度多采几次能换来更稳定的读数很值。4.3 查表与线性插值算法整数运算拒绝浮点查表逻辑在前面表格的基础上写。表按温度从低到高排列ADC值递减。当前ADC值落在哪两个表项之间温度值就按比例在这两个温度之间线性插值。因为ADC和温度关系不是严格线性这个插值会有少量误差但表间隔取10℃时误差通常小于0.5℃完全够用。代码实现如下const unsigned short code adc_table[] { 3158, 2739, 2278, 1824, 1416, 1082, 816 }; const signed int code temp_table[] { 0, 10, 20, 30, 40, 50, 60 }; #define TABLE_N (sizeof(adc_table) / sizeof(adc_table[0])) // 返回值为温度放大了10倍例如25.3℃用253表示 signed int GetTemperature(unsigned short adc_val) { unsigned char i; // 低于最低档当前温度小于0℃ if (adc_val adc_table[0]) { return temp_table[0] * 10; } // 高于最高档当前温度大于60℃ if (adc_val adc_table[TABLE_N - 1]) { return temp_table[TABLE_N - 1] * 10; } // 查找所在区间 for (i 0; i TABLE_N - 1; i) { if (adc_val adc_table[i] adc_val adc_table[i 1]) { unsigned long span (unsigned long)(adc_table[i] - adc_table[i 1]); unsigned long ratio (unsigned long)(adc_table[i] - adc_val) * 100UL / span; signed long temp (signed long)temp_table[i] * 100L; temp ((signed long)(temp_table[i 1] - temp_table[i]) * (signed long)ratio) / 100L; return (signed int)temp; } } return temp_table[TABLE_N - 1] * 10; }这段代码里ratio是当前点在区间内的百分比位置范围0到100。温度查完再乘以10返回这样后续判断45.0℃超温的时候直接和450这个整数比较完全避开浮点运算。这种整数化处理在8位单片机上非常实用RAM占用低执行速度快。主循环里把ADC读出来丢给查表函数再和阈值比较控制LED输出。逻辑就这么几行代码但整个项目的核心都在这个查表函数的质量上。4.4 编译与OTP烧录验证烧录前最后三道检查代码写完不是立刻烧录。OTP芯片烧一次就报废所以烧录前我习惯做三道检查。第一道检查看编译输出里的ROM占用率。如果程序空间用了90%以上建议先不烧录回去优化代码。占用率太高意味着后续哪怕只改一行代码都可能爆空间而OTP芯片没有任何“擦掉重来”的机会。第二道检查逐个确认IO方向配置。上电瞬间IO是输出还是输入、输出是高还是低都要对着原理图过一遍避免烧录后设备一上电就误动作。第三道检查拍板确认代码版本。我吃过亏改完Bug后手一抖烧了上一版的Hex文件整片芯片作废烧完才发现逻辑还是旧的。现在烧录前一定会把Hex路径亮出来对着修改时间再看一遍。烧录器连接好芯片放上烧录座在NYIDE里选择生成好的烧录文件点烧录按钮。烧录成功后如果设置了代码保护位芯片内程序无法再被读回对量产防抄板很重要。但要注意代码保护位要在烧录配置文件里提前勾选烧完再想补就来不及了。烧录完成后上电用万用表量一下ADC采样点电压看看和理论值是否接近再用手捏住NTC或者用热风枪吹一下观察温度读数变化方向。如果方向反了大概率是NTC和固定电阻的位置接反或者查表方向写反回到硬件和代码里排查比拔芯片来得快。5. 常见问题与排查技巧实录5.1 NYIDE环境篇编译报错、激活失败、烧录无响应现象可能原因解决办法编译报错找不到头文件工程路径含中文/空格路径全部改为英文重新添加文件IDE打开闪退杀毒软件误删或隔离组件关闭杀软重装目录加白名单License激活失败填写信息不匹配或系统时间不对核对机器码检查系统时间复制粘贴激活码烧录提示Target MCU error接线错误或芯片放反核对CLK/DAT线序确认芯片缺口方向设备管理器显示未知设备驱动未正确安装手动指向IDE驱动目录禁用驱动强制签名后安装这里特别强调一下Windows驱动签名的问题。新版系统对未经微软签名的驱动管控很严九齐这种小众厂家的驱动经常没法直接装。不要慌进入高级启动修复模式禁用驱动签名强制之后再更新驱动就顺利了。装好之后烧录器拔插一次确认设备管理器识别正常再进行烧录。5.2 NTC测温篇读数漂、自热和VREF那些事现象可能原因解决办法温度读数整体偏高NTC自热明显增大固定电阻降低电流或间歇式采样读数在某个范围跳变采样通道稳定时间不足ADC通道切换后加延时软件中去极值平均45℃附近误差特别大固定电阻精度差换1%精密电阻有条件做整机标定电池供电时读数不稳VDD变化影响参考电压确保ADC参考和分压供电同源比率测量高低温读数失真查表区间边界处理不对检查表方向确认边界返回逻辑NTC自热是个容易忽略的问题。如果发现温度读数一直比实际温度高而且电流越大偏差越明显基本就是自热。解决办法是在软件上做PWM式采样每隔几百毫秒给分压电路通电ADC转换完成后马上把电源断开这样平均功耗大幅降低自热问题随之缓解。代价是硬件上要多一个IO控制电源软件上多一个延时逻辑但对精度要求高的项目很值得。5.3 OTP芯片的“后悔药”仿真、读回和测试点OTP芯片最痛苦的就是没有第二次机会。尽量在写片前把逻辑想清楚但这不代表不需要留后路。第一层后路是硬件仿真器。九齐自家的仿真器可以完美模拟062E的行为在线调试程序。虽然仿真器价格对个人爱好者来说不便宜但如果你要长期做九齐方案这个投入能帮你省下无数片OTP。仿真器能在运行中查看RAM、寄存器和ADC采样结果调NTC查表算法简直不要太爽。第二层后路是IO口调试。没有仿真器的话就靠IO口输出状态来观察程序执行到哪个分支。我在调查表函数的时候用两个IO口接逻辑分析仪一个在ADC转换开始前拉高一个在查表结束后拉高通过测量两个脉冲的宽度和间隔基本能判断程序是否卡死、查表是否异常。虽然土但在没有任何调试手段的情况下非常有效。第三层后路是预留测试点和串口打印。062E没有硬件串口但可以软件模拟UART只是波特率不能太高9600基本是极限。把ADC原始值、查表结果通过串口发出来用USB转TTL接电脑看这样能拿到采集数据的量化值对排查非线性误差和查表边界问题非常有帮助。模拟串口占用的ROM空间不大调试完成后可以裁剪掉正好把这部分资源释放给正式功能。6. 最后分享一点我的体会这套项目做下来最大的感受是九齐单片机不是不能做温度检测而是你得先适应它的开发节奏。NYIDE确实老OTP确实残酷但当你把资源限制看成一种约束而不是障碍整个设计思路反而会变得更清晰——每一个变量都精打细算每一行代码都反复确认程序跑起来之后的稳定感是那些堆配置的工程师感受不到的。关于NTC测温本身查表加插值这个方案经过实测在0到60℃范围内稳定工作在1℃误差内响应速度也能满足小家电的过温保护需求。如果后续产品要扩展显示、通信或者多路温度检测只要把ADC通道和查表表项扩展一下框架完全不用推翻重来。至少对我来说这种小成本方案的性价比已经很高了。
返回列表