ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于SWM181的ADC评估板设计:从电源树到采样校准实战

基于SWM181的ADC评估板设计:从电源树到采样校准实战 简介基于SWM181CBT6-50单片机设计的ADC评估板全套资料面向嵌入式硬件工程师与国产芯片应用开发者适合需要快速掌握SWM181系列微控制器ADC功能、或参考Altium工程做硬件设计的人群。压缩包约40.73MB主要包含Altium Designer原理图与PCB文件、软件code代码及应用文档PCB为97x58mm双层板双面布局布线完整可在AD软件中直接打开和修改。板上集成SWM181CBT6-50 MCU、AMS1117-3.3稳压、SX1308升压、TL431基准等元件构成完整的ADC评估硬件环境配套代码与文档可帮助理解外设配置、采样流程及硬件协同设计。资源已有314人学习浏览从原理图、版图到固件与说明文档一应俱全适合作为基于国产Cortex-M0的ADC采集方案的开发参考与模板。1. 为什么需要一块SWM181CBT6-50的ADC评估板作为国产Cortex-M0系列的一员SWM181CBT6-50片内ADC虽然在数据手册上标称12位分辨率但真实的有效位数往往取决于外部基准源、电源纹波和输入信号源的输出阻抗。拿一块97x58mm的双面评估板做信号链验证比直接在最小系统板上飞线要可靠得多。这块板子的价值在于把SX1308升压、AMS1117稳压、TL431基准和电阻分压网络整合到一个闭环里可以直接评估ADC在不同供电和参考条件下的表现。适合正在做传感器采集、电池电压监测或者02.5V模拟量变送器的硬件工程师用来验证国产MCU的ADC性能以及后续产品化时的电源、布局方案。2. 原理图设计电源树、基准源与模拟输入的网络表级拆解2.1 为什么用SX1308升压和AMS1117-3.3降压的组合评估板的电源输入通常来自USB或者外部直流电源宽电压输入时SX1308作为升压级把电压调整到5V再用AMS1117-3.3得到3.3V给MCU和模拟电路。SX1308的开关频率和纹波输出在空载时并不理想直接给TL431供电会引起基准波动所以中间必须经由LDO二次稳压而不是把升压输出直接接在VREF引脚上。常见做法是VIN - SX1308 - 5V母线 - AMS1117 - 3.3V其中TL431从3.3V串联电阻取电形成2.5V低阻抗基准。电阻分压网络用于产生ADC输入测试电压评估板上放了RESISTOR TAPPED 2K元件这种电阻排可以输出2.0V推挽信号配合阻容滤波后进入MCU的采样引脚。设计时注意模拟输入网络的总输出阻抗决定了采样电容充电时间如果串联电阻过大需要增大软件里的采样周期或在引脚前添加一级运放跟随。2.2 关键器件选型和电源参数计算器件型号/规格作用关键参数U1SWM181CBT6-50Cortex-M0 MCU50MHz主频12bit ADCU2AMS1117-3.3LDO输出3.3VDropout约1.1VU3SX1308升压DC-DC内置MOSVref 0.6VU4TL431_SMD可调基准2.5V典型输出R分压RESISTOR TAPPED 2K模拟输入2K总阻值LED0805翠绿电源指示限流150ΩSX1308的输出电压由分压电阻决定下面这段Python脚本可以快速计算需要的电阻比# SX1308 Vout 0.6V * (1 R1/R2)这里R1为上臂R2为下臂 R1 100e3 R2 22.1e3 Vref 0.6 Vout Vref * (1 R1 / R2) print(fSX1308输出: {Vout:.2f}V) # TL431阴极电阻取值假设需要1mA工作电流电源3.3V Rk (3.3 - 2.5) / 0.001 print(fTL431阴极电阻约: {Rk:.0f}Ω)这段脚本里R1和R2的比值直接决定升压输出实际选型要找E96系列贴近值比如100K和22.1K算出来是4.925V不是正好5V这时可以在后续LDO容许范围内接受因为AMS1117输入只要大于4.0V即可稳定输出3.3V。TL431的阴极电阻关系到基准噪声电流过大基准的bandgap噪声会升高电流过小动态阻抗变大、带载能力变弱我一般控制在0.52mA之间并预留测试点。2.3 最小系统与ADC参考电压连接SWM181CBT6-50的最小系统需要外部晶振评估板通常用内部RC时钟此时外接晶振可以省略、复位电路和启动模式选择电阻。ADC部分的关键是VREF引脚不能直接接3.3V至少串一个磁珠或者RC滤波后连接到TL431的阴极并在VREF引脚旁放置100nF/1nF组合去耦电容。如果数据手册允许外部参考电压输入那么TL431的输出精度会直接影响采样结果因为12位ADC的1个LSB在2.5V参考下约为0.61mVTL431的精度通常在1%以内可以作为2.5V标准源。模拟输入通道的阻容取值同样可以从采样时间反推。假设采样电容为10pF输入电阻R1.1K则时间常数为11ns采样周期设置为32个ADC时钟时在8MHz采样时钟下约为4us是时间常数的350倍以上可以认为建立完成。如果串入的电阻大于10K就需要把采样周期加大到128以上否则高码值区域的读数会明显偏低这是adc采样周期配置不当造成误差的典型场景。3. 2层板布局与布线把ADC采样误差扼杀在97x58mm之内3.1 双面布局的元件摆放顺序97x58mm的板子做2层双面放件首要任务是按信号流向分区。输入连接器和模拟调理放在左侧MCU和数字接口放在右侧SX1308开关电源放置在角落并尽量远离ADC输入引脚避免磁场耦合。接地策略上通常做整板铺地铜不机械地大面积分割地而是在模拟区域的边界处挖空铜皮形成0.5mm宽的隔离带把模拟地和数字地通过磁珠或0欧电阻单点连接。如果直接物理断开地平面会让回流路径绕过下层的数字走线反而引入共模噪声。元件摆放顺序建议先固定SWM181CBT6-50的中心位置然后围绕它放ADC通道的RC滤波器件再往外放LDO和基准最后把SX1308的功率电感和肖特基二极管放在远离模拟输入的板边。这样97x58mm的尺寸内模拟部分到MCU引脚的距离能控制在8mm以内走线阻抗和寄生电容都更容易控制。3.2 模拟走线、guard ring与电源去耦ADC输入走线应尽量粗短1.1KΩ/150Ω的0603电阻和100nF电容组成的RC滤波必须靠近MCU的ADC引脚保证高频噪声旁路到模拟地。对于PA0这类模拟输入可以在走线的顶层包围一圈接模拟地的铜环即guard ring。这个环与走线间距不小于0.3mm利用低漏电PN结的漏电流特性把来自周边网络的漏电通道钳位到地减少微弱电流测量时的读数漂移。如果做的是2.5V满量程电压测量影响不明显但一旦测量内阻较高的传感器信号guard ring的价值就体现出来了。去耦电容的摆放顺序也有讲究SX1308输出的5V先经过47uF/10uF钽电容储能再进入AMS1117的输入脚3.3V输出端使用10uF和100nF组合MCU电源引脚每一对都用0603的100nF就近放置。ADC内部开关电容在采样瞬间会抽取尖峰电流这个电流必须由紧靠VREF和AVDD的去耦电容提供而不是靠远处LDO引过来的长走线否则每次转换结果都会叠加一个随采样通道变化的电压跌落。3.3 PCB DRC自检脚本与监管规则Altium Designer工程里如果布局完成后担心有网络没连上可以用内置脚本来批量检查。下面是一段DelphiScript示例遍历当前PCB板上的所有网络统计没有DRC批处理错误的连接// Altium Designer PCB批量检查统计所有完全连接的网络数 var Board : IPCB_Board; Net : IPCB_Net; i, ok : Integer; begin Board : PCBServer.GetCurrentPCBBoard; if Board nil then Exit; ok : 0; for i : 0 to Board.NetCount - 1 do begin Net : Board.Net[i]; if Net.ViolationsCount 0 then Inc(ok); end; ShowMessage(完全连接网络: IntToStr(ok) / IntToStr(Board.NetCount)); end;这段脚本先获取当前PCB文档对象然后遍历网络列表Net.ViolationsCount记录了该网络下的飞线或DRC错误。跑完后重点去看那些连接数为0的Harmful报告因为ADC评估板的模拟输入网络在双面布局时最容易被高速数字线跨越正常情况下没有绿色十字飞线才适合出Gerber。实际生产文件中还要设置最小线宽为6mil电源线放宽到20mil丝印离焊盘0.3mm以上避免后面做小批量贴片时元器件被丝印压住。3.4 2层板与四层板的差别如果这块评估板量产化成本敏感时2层板完全可行但ADC性能会受限于回流路径不完整。4层板可以把第二层完整铺地第三层走电源顶层放信号能明显降低参考地和信号地的阻抗但造价也贵。评估板阶段更值得做的是在2层板的底层加大面积铺地关键模拟区域禁止走数字线而不是去追求地平面完整性。只要按上面的放置顺序和guard ring操作97x58mm面积足够放下所有器件量产板再根据实际EMI测试结果决定是否升级到4层。4. 软件code代码从寄存器配置到采样值校准4.1 SWM181 ADC外设的初始化流程拿到评估板后如果例程代码不匹配可以按照外设库的文件结构自己写一个初始化。SWM181的ADC模块通常由时钟控制寄存器、通道选择寄存器、转换配置寄存器和结果数据寄存器组成。以官方外设库风格为例初始化代码大致如下/* SWM181 ADC 初始化通道0外部基准采样周期32T */ void Init_ADC0(void) { // 1. 打开ADC时钟 SYS_PCLK_CSR | (1UL 5); // 2. 配置PA0为模拟输入内部上拉/下拉关闭 GPIO_InitTypeDef gpio_cfg; gpio_cfg.pin GPIO_PIN_0; gpio_cfg.mode GPIO_MODE_ANALOG; GPIO_Init(GPIOA, gpio_cfg); // 3. ADC参数填充 ADC_InitTypeDef adc_cfg; ADC_StructInit(adc_cfg); adc_cfg.ADC_ClkDiv 8; // 分频得到合适ADC时钟 adc_cfg.ADC_RefSource ADC_REF_EXTERNAL; // 使用外部TL431基准 adc_cfg.ADC_SampleTime ADC_SAMPLETIME_32CLK; // 采样周期32个时钟 adc_cfg.ADC_Mode ADC_MODE_SINGLE; // 单次转换模式 ADC_Init(ADC, adc_cfg); // 4. 选择通道并清除标志 ADC_ChannelSelect(ADC, ADC_CH_0); ADC_ClearFlag(ADC); }代码里第一行打开了ADC外设时钟不同库函数命名可能略有差异但这一步不能省略第二组GPIO配置决定引脚是模拟还是数字忘记切到模拟模式会把采到的信号拉死到高或低电平第三条ADC_ClkDiv值得单独调分频太大会让采样率下降分频太小则ADC工作频率超过规格书的上限通常把ADC时钟控制在1MHz到2MHz之间但这里使用8分频需要计算具体主频。ADC_SampleTime这里的32个采样周期在模拟前端输出阻抗不高于1K时足够如果你把前级电阻换成10K就应当改成128周期并重新编译验证。4.2 采样数据的平均滤波与中断处理实际使用中单次读取的结果抖动一般在±3个LSB左右采用简单滑动平均就能把多数随机噪声压下去。下面给出一个16点平均函数#define TEMP_BUF_SIZE 16 uint16_t adc_value; uint16_t adc_buf[TEMP_BUF_SIZE]; uint8_t adc_idx 0; uint16_t ADC_GetSmoothValue(void) { uint32_t sum 0; for (uint8_t i 0; i TEMP_BUF_SIZE; i) { ADCSOF 1; // 启动转换 while (!ADCEOF); // 等待转换结束 adc_buf[adc_idx] ADC_DATA; // 读取结果 adc_idx (adc_idx 1) % TEMP_BUF_SIZE; } for (uint8_t i 0; i TEMP_BUF_SIZE; i) sum adc_buf[i]; return (uint16_t)(sum / TEMP_BUF_SIZE); }ADC_DATA读取的是一个16位寄存器SWM181实际有效位是12位高四位方向因设计而异。ADCSOF和ADCEOF是伪代码写法具体位名以库函数为准。16点平均带来的好处是每个点只增加一次转换时间在采样率要求不高的温度采集场景下完全值得。如果要在后台轮流采样多通道可以由定时器中断每100us触发一次转换在转换完成中断里把结果送入缓冲区再在主循环里做滑动平均。注意不能在中断里做浮点缩放否则会占用大量的CPU周期。4.3 外部ADC三点校准法ADC数据漂移主要来自基准和输入电阻的温漂评估板阶段做三点校准能明显改善精度。方法是用高精度电压源向模拟输入依次灌入0V、1.25V、2.5V三个标准电压记录每个点对应的采样码值然后线性插值。校准数据可以存放在MCU内部Flash的独立扇区校准点标准电压(V)采样码值(理论)实际读取码值P10.0003P21.2520482045P32.5040954091利用这三组点计算偏移量和增益误差偏移量是零输入时读数不为0的误差增益误差则通过P2点和P3点的斜率与理论斜率比较得出。采用两点校准已经可以补偿大部分误差第三点用来验证线性度同时能发现输入电阻太大导致的高端饱和问题。我在实际产品中会把校准结果做成查表形式每5个代码间隔线性化一次这样整条曲线误差可控制在0.1%以内。5. 最终验证评估板到产品化的三个实用技巧5.1 用可调负载排查电源纹波干扰电源部分潜在风险最大的是SX1308的开关纹波叠加到基准和模拟地上。验证方法给评估板带载一个约200mA的LED负载用示波器探头在TL431阴极和AMS1117输出端观察若发现50kHz1MHz的开关毛刺试着重做SX1308反馈端的Layout使反馈走线远离功率电感并在输出反馈电阻上并联10pF电容做相位补偿。此时再读ADC如果最低位码值的随机跳动明显减小说明纹波衰减到位。5.2 输入阻抗与采样周期联动调整当模拟输入端换上1MΩ的高阻传感器时不要急着加运放先把采样周期从32提高到512看看。SWM181的采样时间可以通过寄存器配置换算成实际充电时间后够不够10个RC时间常数用万用表在PA0引脚上量到的电压与实际分压值比较即可判断。如果512个时钟周期仍偏低再考虑加跟随器或减小分压电阻阻值。5.3 量产化时添加自检通道评估板通常预留至少一个ADC通道不接外部信号产品设计时可以把它连接到TL431的2.5V输出做成诊断通道。每次上电后采集该通道码值如果与校准表的偏差超过±15个LSB就认为基准源老化或供电异常这时可在固件里设置报警标志。这个技巧不增加任何硬件成本却能在现场快速区分“采集电路坏”和“传感器坏”是ADC评估板转化成量产设计时很实用的一步。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进