STM32波形发生器设计:从DAC原理到Proteus仿真的完整项目实践

发布时间:2026/9/5 14:53:22
STM32波形发生器设计:从DAC原理到Proteus仿真的完整项目实践 简介本资源是一套面向嵌入式初学者与课程设计者的STM32波形发生器完整仿真开发包聚焦于软硬件协同验证能力培养解决无实物调试条件下波形生成原理理解与工程实现落地的痛点。资源包含Proteus仿真工程、Keil MDK源码及详细设计报告覆盖正弦波、方波、三角波、锯齿波四种基础波形的算法生成、按键交互控制、LCD12864实时参数显示及DAC0832数模转换驱动全流程。压缩包共115个文件以37个.h头文件和36个.c源文件构成核心固件含STM32F10x标准外设库如tim、adc、rcc、usart等模块辅以.s启动文件、.hex可执行镜像、.png界面截图及.doc设计文档整体体积5.07MB结构清晰便于分模块学习与移植。目前已有223人学习下载提供从原理图搭建、代码编译到仿真观测的一站式参考特别适合单片机课程设计、电子系统综合实训及ProtuesSTM32入门项目实践。1. 项目概述从需求到实现的完整路径最近在整理一些嵌入式开发的旧项目翻到了当年做的一个基于STM32的波形发生器设计感觉挺有代表性的。这个项目麻雀虽小五脏俱全涵盖了单片机选型、DAC/定时器驱动、人机交互、Proteus仿真验证以及完整的文档撰写。对于想从51单片机进阶到STM32或者想系统学习如何将一个想法从仿真做到实物报告的工程师和学生来说这个案例的参考价值很大。它解决的核心问题就是如何用一颗性价比极高的Cortex-M3内核单片机稳定、灵活地产生四种基础波形正弦波、方波、三角波、锯齿波并通过仿真提前规避硬件设计风险。很多人一上来就画板子、焊电路结果调不通又找不到原因。我这个项目的思路是先软后硬在Proteus里把单片机的程序逻辑、外围电路包括按键、LCD显示、运放调理电路全部跑通得到稳定的仿真波形和交互效果后再着手制作实物。这样做的好处是硬件成本几乎为零时就能验证核心算法和系统架构的可行性。特别适合在项目立项初期、参加电子设计竞赛或者课程设计时采用。你只需要一台电脑装上Keil、Proteus和Virtual Serial Port Driver这类虚拟串口工具就能搭建一个完整的虚拟开发环境。接下来我会把这个项目的设计思路、核心代码、仿真搭建细节以及报告中需要突出的要点毫无保留地拆解一遍。无论你是刚接触STM32的新手还是想寻找一个完整项目参考的老鸟都能从中找到可以直接“抄作业”的模块。2. 核心方案设计与器件选型考量2.1 主控芯片为什么是STM32F103C8T6在众多STM32型号中选择经典的“蓝桥杯”小蓝板核心芯片STM32F103C8T6是经过深思熟虑的。首先对于波形发生器最关键的外设是DAC数模转换器和定时器。F103C8T6片内集成了2个12位DAC通道这对于输出模拟电压波形是硬性需求。虽然也可以用PWM加低通滤波来模拟但精度和波形纯度会打折扣。其次它拥有多达4个通用定时器我们可以用一个高级定时器如TIM1来产生高精度的时基触发DAC进行数据更新从而保证输出波形的频率精确和稳定。从资源角度看64KB Flash和20KB RAM对于这个项目绰绰有余。我们还需要驱动一个字符型LCD如1602来显示波形类型和频率参数这就需要一些GPIO和延时函数。F103C8T6的GPIO数量也完全满足连接几个独立按键和LCD的需求。最后从生态和成本考虑这款芯片资料最全价格便宜相关的Proteus仿真模型也最成熟极大降低了学习和调试门槛。如果选型F407或者H750性能固然强大但对于基础波形发生来说属于性能过剩且仿真支持可能不完善。2.2 波形生成方案DAC直接输出 vs PWM滤波这是本项目的核心决策点。方案一是直接使用片内DAC这是最正统、性能最好的方法。DAC在收到定时器触发信号后直接输出对应的电压值波形纯净谐波失真小。我们需要做的就是预先计算好一个波形周期对应的数据表例如一个正弦波周期取256个点然后由定时器以固定频率触发DAC从表中依次取出数据并转换。方案二是使用PWM配合外部RC低通滤波器。通过调节PWM的占空比来等效模拟电压值经过滤波后得到平滑的模拟电压。这种方法成本低任何有PWM功能的单片机都能实现。但缺点很明显波形精度和频率受限于PWM分辨率和滤波器性能高频响应差且动态改变频率时需要同步调整滤波器参数非常麻烦。因此本项目毫不犹豫地选择了DAC直接输出方案。它虽然对单片机有特定要求但带来的性能提升是质的飞跃尤其适合对波形质量有要求的场合。2.3 人机交互与显示方案设计一个可用的波形发生器必须能让人设置参数和看到状态。我的设计采用了“按键LCD”的经典组合追求极致的稳定和可靠。按键输入使用了4个独立按键功能定义为“波形选择”、“频率加”、“频率减”、“确认/输出开关”。采用扫描方式配合软件消抖电路简单编程直观。为什么不选用矩阵键盘或编码器对于只有几个参数的设备独立按键完全够用且抗干扰能力强在仿真和实物中表现一致。显示输出选用LCD1602字符型液晶模块。它能够显示两行每行16个字符足以清晰地显示“Wave: Sine”、“Freq: 1000Hz”这样的信息。驱动协议是标准的4位或8位并口网上例程海量。在Proteus中也有非常精准的仿真模型所见即所得。虽然OLED更漂亮但在早期仿真验证阶段LCD1602的稳定性和普适性更佳。2.4 仿真环境Proteus 8.9Virtual Terminal为什么一定要用Proteus做仿真对于单片机学习尤其是STM32这类稍微复杂的芯片直接硬件调试固然最终必须但仿真能极大提高效率。你可以在没有硬件的情况下验证GPIO控制、定时器中断、串口通信等逻辑是否正确。本项目中Proteus的作用有三个电路验证检查单片机最小系统、按键电路、LCD连接、DAC输出运放调理电路如电压跟随器、反相放大电路是否存在原理性错误。程序联调通过Keil生成HEX文件加载到Proteus的STM32模型中可以像真实芯片一样运行程序。你可以单步调试观察寄存器变化。波形观测使用Proteus内置的虚拟示波器OSCILLOSCOPE和逻辑分析仪可以直接观测DAC输出引脚上的模拟电压波形测量其频率、幅值非常直观。这里有个关键技巧Proteus自带的STM32模型运行速度远低于真实芯片。为了获得接近真实的仿真效果需要在Proteus中修改STM32元件的“Clock Frequency”属性将其设置为与程序中所用系统时钟一致如72MHz。同时将“Simulate Model Fidelity”设置为“Typical”或“High”以获得更准确的时序仿真。3. 系统软件架构与核心模块实现3.1 主程序流程与状态机设计整个软件的运行核心是一个简单的状态机它决定了系统在任何时刻应该做什么。主循环的职责非常清晰扫描按键、更新显示、其余时间等待中断。真正的波形生成工作完全由定时器中断服务例程ISR来完成这是一种典型的前后台系统架构。int main(void) { // 1. 初始化所有硬件 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DAC_Init(); MX_TIM2_Init(); // 用于波形更新的定时器 MX_TIM3_Init(); // 用于按键扫描的定时器10ms LCD_Init(); // 2. 初始化全局变量和状态 g_wave_type WAVE_SINE; g_freq 1000; // 默认1kHz g_output_enabled 0; LCD_Display_Info(g_wave_type, g_freq, g_output_enabled); // 3. 启动定时器 HAL_TIM_Base_Start_IT(htim3); // 按键扫描定时器 // 注意波形更新定时器TIM2在“输出开关”打开时才启动 // 4. 主循环 while (1) { // 状态机处理 switch (g_sys_state) { case STATE_IDLE: // 仅刷新显示处理按键事件在中断中设置标志 if (key_event_flag) { Key_Process(); key_event_flag 0; LCD_Display_Info(...); } break; case STATE_OUTPUTTING: // 输出状态下除了处理按键还要处理可能的频率切换 // 波形生成由TIM2中断全权负责主循环不干预 if (freq_changed_flag) { Update_TIM2_ARR(g_freq); // 动态改变定时器周期 freq_changed_flag 0; } break; } } }这个架构的优势是逻辑清晰中断响应及时。按键扫描放在一个低速定时器中断里如10ms一次既保证了响应速度又避免了在主循环中阻塞。波形更新放在一个高速高精度定时器中断里确保每个采样点输出的时间间隔绝对精确。3.2 波形数据表的生成与优化DAC输出波形的本质是定时器每隔一段时间Ts触发一次DAC转换输出的电压值来自一个预先计算好的数组。这个数组就是一个波形周期内的采样点。这里以生成一个1Vpp峰值到峰值0V偏置的正弦波为例讲解如何生成这个表。首先确定两个关键参数采样点数N一个波形周期用多少个点来描绘。点数越多波形越光滑但对存储和计算速度要求越高。对于12位DAC256点是一个很好的平衡点精度足够且一个周期正好是2的8次方某些计算可以优化。DAC值范围STM32的DAC是12位对应数值0-4095。假设我们通过运放调理希望最终输出为±0.5V即1Vpp中心0V。如果运放电路是双电源供电且增益为1那么DAC输出0V对应中间值2048假设参考电压3.3V则 0V 3.3V/2 ≈ 1.65V对应DAC值 1.65/3.34095≈2048。那么±0.5V就对应DAC值在2048±(0.5/3.34095)≈2048±620 范围内变化即1428到2668。我们可以用Python或MATLAB生成这个表然后以C数组的形式嵌入代码# generate_wave_table.py import numpy as np N 256 # 采样点数 amplitude 620 # 幅度对应的DAC增量 offset 2048 # 零点对应的DAC值 sine_table [] for i in range(N): value offset int(amplitude * np.sin(2 * np.pi * i / N)) sine_table.append(value 0xFFF) # 确保在0-4095范围内 # 输出C数组格式 print(const uint16_t sine_wave_table[256] {) for i in range(0, N, 16): # 每行16个 print( , .join(f{v:4d} for v in sine_wave_table[i:i16]) ,) print(};)对于方波、三角波、锯齿波其数据表更简单。方波就是前一半点数为高电平值如2668后一半为低电平值1428。三角波是从最小值线性增加到最大值再线性减少。锯齿波是从最小值线性增加到最大值后直接跳回最小值。注意将这些常量数组存储在Flash中而不是RAM中。使用const关键字编译器会将其放到只读区域节省宝贵的RAM空间。对于STM32F103C8T620KB的RAM很宝贵。3.3 定时器触发DAC的双缓冲机制这是保证波形输出连续、无毛刺的关键技术。STM32的DAC支持DMA和定时器触发。我们采用“定时器触发 DMA双缓冲”模式。工作原理我们准备两个波形数据缓冲区BufA和BufB每个大小是半个波形周期128点或一个完整周期。初始化DMA将其配置为从BufA取数据送到DAC的数据寄存器。并开启DMA的“双缓冲”模式和“半传输完成/传输完成中断”。配置一个定时器如TIM2为更新触发模式其溢出频率决定了波形采样率。频率 定时器时钟 / (ARR 1)。将这个定时器的更新事件连接到DAC的触发源。启动定时器和DAC触发。每次定时器溢出就会触发一次DAC转换同时DMA自动将下一个数据从缓冲区搬运到DAC。当DMA搬运完BufA的前一半半传输完成中断或全部传输完成中断时我们在中断服务程序里迅速将下一个要输出的波形数据填充到当前不活跃的缓冲区BufB。这样DMA在后台自动切换缓冲区实现了数据输出的“乒乓操作”确保了数据流的无缝衔接。这种机制的好处是CPU只需要在DMA中断里更新缓冲区数据其余时间可以处理按键、显示等任务大大减轻了CPU负担并且能输出非常高频率的波形。// HAL库配置示例片段 // 1. 配置DAC通道1触发源为TIM2更新事件 hdac.Instance DAC1; hdac.DAC_Trigger DAC_TRIGGER_T2_TRGO; HAL_DAC_Init(hdac); // 2. 配置DMA为双缓冲模式 hdma_dac1.Init.Mode DMA_NORMAL; // 对于双缓冲通常用循环模式 hdma_dac1.Init.PeriphInc DMA_PINC_DISABLE; hdma_dac1.Init.MemInc DMA_MINC_ENABLE; hdma_dac1.Init.PeriphDataAlignment DMA_PDATAALIGN_HALFWORD; hdma_dac1.Init.MemDataAlignment DMA_MDATAALIGN_HALFWORD; hdma_dac1.Init.Mode DMA_CIRCULAR; // 循环模式 hdma_dac1.Init.Direction DMA_MEMORY_TO_PERIPH; // 关键双缓冲配置 hdma_dac1.Init.MemBurst DMA_MBURST_SINGLE; hdma_dac1.Init.PeriphBurst DMA_PBURST_SINGLE; hdma_dac1.XferCpltCallback DMATransferComplete; // 传输完成回调 hdma_dac1.XferM1CpltCallback DMATransferComplete; // 内存1传输完成回调 hdma_dac1.XferHalfCpltCallback DMATransferHalfComplete; // 半传输完成回调 // 3. 启动DAC以DMA方式输出 HAL_DAC_Start_DMA(hdac, DAC_CHANNEL_1, (uint32_t*)wave_buffer, buffer_size, DAC_ALIGN_12B_R);3.4 频率精确控制与动态调整波形频率由两个因素决定波形数据表一个周期的点数N和定时器触发频率Fs。最终输出频率Fout Fs / N。因此要改变输出频率我们有两种方法固定点数N改变定时器频率Fs这是最常用的方法。通过改变定时器的自动重装载值ARR来改变其溢出频率。例如系统时钟72MHz预分频器PSC设为71则定时器时钟为1MHz。要产生1kHz的波形假设N256则需要的触发频率 Fs Fout * N 256kHz。那么ARR值应为 1MHz / 256kHz - 1 3.9 -1 ≈ 3。在程序中我们可以根据目标频率实时计算ARR值并更新定时器寄存器。固定Fs改变点数N这种方法不常用因为动态改变数据表大小很麻烦而且会影响波形质量。本项目采用第一种方法。在按键调整频率时程序会根据新的频率值重新计算TIM2的ARR值并调用__HAL_TIM_SET_AUTORELOAD(htim2, new_arr)函数进行更新。这里有一个重要细节为了在波形输出过程中平滑地改变频率最好在定时器更新事件的中断里或者确保在DMA搬运数据的间隙如双缓冲切换时修改ARR以避免在单个波形周期内发生频率跳变导致波形畸变。4. Proteus仿真电路搭建与调试实录4.1 核心仿真电路图详解在Proteus中搭建电路目的是模拟真实硬件环境。下图是核心部分的示意注以下为文字描述实际仿真需在Proteus中绘制MCU部分从元件库选择“STM32F103C8”放置。连接其OSC_IN和OSC_OUT到两个22pF电容并接地中间接8MHz晶振构成外部时钟源。NRST引脚接10k上拉电阻和100nF电容到地构成复位电路。VDDA和VSSA模拟电源必须连接到数字电源VDD和VSS并加上去耦电容100nF和10uF并联这点在仿真中常被忽略导致DAC工作不正常。DAC输出调理DAC输出引脚PA4或PA5连接一个运算放大器如LM358构成的电压跟随器以增加驱动能力。跟随器输出再接一个简单的反相比例放大电路如果需要调整幅值。最后输出点连接一个虚拟示波器OSCILLOSCOPE的A通道。人机交互按键四个按键一端分别接PA0~PA3另一端接地。GPIO口配置为上拉输入模式按键按下时读到低电平。LCD1602数据线DB0-DB7接PB0-PB7RS、RW、E三个控制线分别接PA6、PA7、PA8。VSS接地VDD接5VVEE对比度调节通过一个10k电位器接电源和地。虚拟串口可选如果需要通过串口发送调试信息可以将USART1的TXPA9连接到虚拟终端Virtual Terminal的RX。这在调试初期非常有用。4.2 仿真模型参数配置要点Proteus中STM32模型的配置直接决定了仿真能否成功以及是否接近真实情况。Program File这里加载由Keil编译生成的.hex或.elf文件。确保Keil中的目标选项Target正确设置了外部晶振频率如8MHz并且代码中SystemClock_Config()函数正确将时钟配置为72MHz。Clock Frequency必须在Proteus元件属性中将“Clock Frequency”设置为与程序最终系统时钟一致的频率即72MHz。如果这里设为默认的8MHz而程序按72MHz运行延时函数会导致仿真速度慢9倍所有时序全部错乱。Advanced Properties可以勾选“Cache Code”加速仿真。对于简单的IO和定时器应用仿真模型保真度Simulate Model Fidelity选择“Typical”即可获得较好的速度和准确度平衡。4.3 联合调试与波形观测技巧搭建好电路后就可以进行软硬件联合调试了。加载程序在Keil中编译工程生成HEX文件。在Proteus中双击STM32元件在“Program File”一栏选择该HEX文件。启动仿真点击Proteus左下角的运行按钮。如果程序正确LCD1602上应该显示出初始信息。操作与观测点击Proteus中的按键图形模拟按键按下。观察LCD显示是否随之变化。然后打开虚拟示波器在“Virtual Instruments”模式中选择OSCILLOSCOPE将其探头连接到运放输出端。调整示波器的时基和电压刻度应该能看到稳定的波形。测量频率在示波器界面上使用光标功能或直接读取频率计如果虚拟示波器有该功能测量波形的实际频率与LCD显示的理论频率进行对比。这是验证定时器计算是否正确的最直接方法。实操心得Proteus仿真STM32时中断响应、定时器时序可能与实物有细微差别尤其是涉及高频操作时。仿真的主要价值在于验证逻辑正确性而非精确的时序性能。如果仿真中波形能稳定出现且频率大致正确那么程序逻辑基本就过关了。实物的细微调整如调整定时器预分频是必要的。5. 项目报告撰写核心要点与避坑指南一份好的课程设计或项目报告不仅仅是代码和电路的堆砌更是设计思路、验证过程和问题分析的完整呈现。以下是撰写“四种波形发生器设计报告”时需要重点突出的章节和内容。5.1 摘要与系统总体设计摘要部分要用200-300字概括整个项目基于STM32F103C8T6单片机利用其内部DAC和定时器设计并实现了一个能产生正弦波、方波、三角波、锯齿波四种波形的发生器。系统通过按键选择波形和调节频率LCD1602实时显示参数并在Proteus中完成了仿真验证。重点突出“DAC直接输出”、“定时器触发”、“双缓冲DMA”等技术关键词。在“系统总体设计”章节画出一个系统框图。框图至少包含STM32最小系统、按键输入模块、LCD显示模块、DAC输出与运放调理模块、电源模块。用箭头标明数据流向和控制关系。紧接着用文字阐述设计思路为什么选择这样的方案DAC vs PWM 独立按键 vs 矩阵键盘等并简要说明软件上的中断驱动架构。5.2 硬件电路设计详解这一部分要分模块讲解电路原理。单片机最小系统给出STM32F103C8T6的复位电路、时钟电路、电源与地、Boot启动模式电路的原理图并解释每个部分的作用。特别是模拟电源VDDA/VSSA的连接和去耦必须强调这是DAC稳定工作的基础。DAC输出电路给出电压跟随器和反相放大电路如果需要的具体原理图标注电阻电容值。计算放大倍数说明如何将DAC的0-3.3V输出调整到所需的电压范围如±5V。解释运放选型如LM358的考量单位增益带宽、压摆率是否满足最高输出频率的要求。人机交互电路给出独立按键的接法解释上拉电阻的作用如果使用内部上拉则可省略外部电阻。给出LCD1602与单片机的连接图说明为什么选择4位或8位数据模式。报告技巧电路图务必清晰、规范使用标准的电路符号。每个元件都要有标号如R1 C2和参数值。可以在图下方用“图X-XX XXXX模块电路原理图”的格式进行说明。5.3 软件程序设计流程图文字描述配合流程图是说明软件逻辑的最佳方式。主程序流程图以“开始”为起点依次是“系统初始化”、“参数初始化”、“开中断”、“进入主循环”。主循环内判断“按键标志位”如果有键按下则“更新显示和参数”否则继续循环。流程图要简洁明了。按键扫描中断服务程序流程图定时器中断触发 - 扫描各行/各列本项目是扫描各独立按键- 消抖判断 - 更新键值标志位 - 退出中断。波形更新中断服务程序流程图DMA半传输/传输完成中断触发 - 判断当前活跃缓冲区 - 向非活跃缓冲区填充下一个波形数据 - 清除中断标志 - 退出中断。核心算法描述用伪代码或公式描述频率计算ARR (Tim_CLK / (Freq * N)) - 1和波形数据表生成算法如sine_table[i] offset amplitude * sin(2π*i/N)。5.4 仿真结果与分析这是报告的重头戏证明你的设计是可行的。仿真环境截图贴上完整的Proteus仿真电路图总览。运行效果截图LCD显示不同波形和频率时的界面截图。虚拟示波器显示四种波形的截图。关键在示波器截图上要清晰展示出波形的形状、幅值Vpp和频率Hz的测量读数。例如正弦波截图显示“Freq: 1.00kHz, Vpp: 1.02V”。结果分析将测量得到的频率、幅值与理论设定值进行对比计算误差。分析误差来源可能是定时器ARR取整误差、运放电路精度、仿真模型本身误差等。讨论波形质量如正弦波是否光滑方波上升沿是否陡峭三角波线性度如何。5.5 常见问题与解决方案QA这部分体现你解决问题的深度是报告的加分项。可以整理成表格问题现象可能原因排查步骤与解决方案Proteus仿真中LCD无显示或乱码1. 数据线/控制线连接错误。2. 初始化时序不对或延时不足。3. Proteus中LCD模型供电或对比度设置问题。1. 对照数据手册检查RS、RW、E引脚连接和时序图。2. 在初始化序列后增加长延时如100ms。3. 检查VDD接5VVSS接地调节VEE电位器。示波器无波形输出1. DAC未正确初始化或未启动。2. 定时器未启动或未连接触发源。3. DMA配置错误数据未搬运。4. 运放电路连接错误或虚拟示波器探头接错位置。1. 检查DAC初始化代码确认已调用HAL_DAC_Start()或HAL_DAC_Start_DMA()。2. 检查定时器是否使能触发输出是否连接到DAC。3. 在Debug模式下查看DMA相关寄存器状态或检查缓冲区数据。4. 用电压探针点测DAC输出引脚和运放输出引脚逐级排查。波形频率严重不准1. 系统时钟配置错误未达到72MHz。2. Proteus中STM32元件“Clock Frequency”属性设置错误。3. 计算ARR值的公式有误或数值溢出。1. 检查SystemClock_Config()函数用Keil的Debug模式查看系统时钟变量如SystemCoreClock。2. 确保Proteus元件属性中的时钟频率与程序设定一致。3. 打印出计算出的ARR值进行核对注意使用足够大的数据类型uint32_t。改变频率时波形出现毛刺或断裂1. 在DMA传输过程中修改了源数据缓冲区。2. 更新定时器ARR的时机不对打断了正在输出的波形周期。1. 使用双缓冲机制确保只在DMA中断半传输/完成中切换和填充缓冲区。2. 在定时器更新事件中断中或确保一次DMA传输完成后再修改ARR寄存器。方波上升/下降沿不陡峭1. 运放压摆率Slew Rate不够无法响应高速变化。2. 仿真中运放模型理想但提示了实物选型要点。1. 在仿真中可尝试更换更高SR的运放模型如TL082。2. 在报告中指出实物应选择SR (2π * Vpp * Fmax) 的运放。5.6 项目总结与扩展方向总结部分不要简单重复摘要而应侧重于设计体会、难点攻克和未来展望。体会与难点可以写“通过本项目深入理解了STM32的DAC与定时器协同工作机理掌握了利用DMA双缓冲实现高速连续数据输出的编程技巧。最大的难点在于动态改变频率时如何保证波形连续最终通过精确控制定时器ARR更新时机得以解决。”扩展方向提出几个可行的升级思路体现你的思考深度例如波形扩展增加任意波形输出功能通过串口或SD卡加载波形数据点。幅度调节增加一个数字电位器或使用DAC的另一通道控制运放增益实现幅值可调。上位机控制增加蓝牙或Wi-Fi模块通过手机APP或电脑软件远程控制波形参数。性能提升选用更高主频、带DMA的DAC的STM32型号如F4系列提升输出波形频率上限和精度。最后将完整的源代码.c和.h文件、Proteus仿真文件.pdsprj、以及报告本身打包形成一个完整的项目交付物。这样的一个项目无论是用于课程答辩、毕业设计还是技能展示都足够扎实和出彩。本文还有配套的精品资源点击获取