sEMG项目总结(3)STM32采集肌电信号

2023-10-26

STM32采集肌电信号

目录

1采集方式ADC+Timer+DMA

(1)肌电信号采集板有双通道,信号的放大倍数可调,采样频率可调
(2)使用STM32的ADC多通道+Timer触发+DMA传输模式采集肌电信号
(3)通过串口将数据实时发送给上位机。
这里写图片描述

2采集程序的配置

肌电信号采集的ADC通道配置子程序如下:
(1)初始化ADC通道的引脚复用功能
(2)设置传输数据的DMA方式
(3)设置ADC通道的采样频率,触发模式,扫描模式等
(4)设置定时器和定时器中断

void ADCInit(void)
{ 
    ADCInit_GPIO();
    ADCInit_DMA();
    ADCInit_ADC();
    ADCInit_Nvic();
    ADCInit_Timer();  
}

3对采集的sEMG的分析

张手、握拳、放松时的肌电信号
这里写图片描述

肌电信号的采样频率是500HZ,对原始信号进行频率变换后可以看到50HZ的工频噪声干扰较大,采用50HZ的数字陷波器滤除工频噪声干扰。采集到的肌电信号最主要的能量集中在20-200HZ。
这里写图片描述

对采集到肌电信号进行预处理、提取特征,输入到分类模型,得到的正确率如下表所示:
这里写图片描述

4STM32F407源码

这里写图片描述
这里只用到main.c、 adc.c、 adc.h

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "adc.h"

int main(void)
{ 
        char buff1[5],buff2[5];

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //设置系统中断优先级分组2
        delay_init(168);                                  //初始化延时函数
        uart_init(115200);                                //初始化串口波特率为115200

        LED_Init(); 
        ADCInit();  

        while(1)
        {   
                if(dateFlag==1)   //判断数据是否已经更新完成
                {           
                        sprintf(buff1,"%.6f,",ch1);  //sprintf()打印到字符串中,printf打印到命令行输出
                    printf("%s",buff1);

                    sprintf(buff2,"%.6f,",ch2); 
                        printf("%s",buff2);

                        dateFlag=0;         
                }                   
        } 
}

adc.h

#ifndef __ADC_H
#define __ADC_H 
#include "sys.h" 
#include "usart.h"

#define  N   5            //每通道采5次
extern double ch1,ch2;    //用来存放采集结果
extern u8    dateFlag;    //数据转换完成标志

static void ADCInit_GPIO(void); 
static void ADCInit_ADC(void);
static void ADCInit_DMA(void);
static void ADCInit_NVIC(void);

void ADCInit_Timer(void);
void ADCInit(void);

double Get_Adc1(vu16 advalue);

#endif 

adc.c

#include "adc.h"
#include "delay.h"      


/* 数据定义 */
vu16  AD_Value[N];  //用来存放ADC转换结果,也是DMA的目标地址
double ch1,ch2;     //用来存放采集的结果
u8    dateFlag=0;
u8 UpdataTIM = 0;       


/*
 * Function    : static void ADCInit_GPIO(void)
 * Description : ADC GPIO初始化
 */
static void ADCInit_GPIO(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);      //使能GPIOA时钟

    //ADC通道初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;       //PA0,PA1 ADC通道
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;               //模拟输入
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;           //不带上下拉
    GPIO_Init(GPIOF, &GPIO_InitStructure);                     //初始化     
}


/*
 * Function    : static void ADCInit_ADC(void)
 * Description : ADC模式初始化
 */
static void ADCInit_ADC(void)
{
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
    ADC_InitTypeDef       ADC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);     //使能ADC3时钟
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);      //ADC3复位
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);     //复位结束     

    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;                     //独立模式
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //两个采样阶段之间的延迟5个时钟
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;      //DMA失能(对于多个ADC通道)
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;                  //预分频4分频
    ADC_CommonInit(&ADC_CommonInitStructure);                                    //初始化

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;  //12位模式
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;            //扫描模式(多通道ADC采集需要用扫描模式)  
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;     //关闭连续扫描
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;  //上升沿触发
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;         //定时器事件2触发ADC
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;     
    ADC_InitStructure.ADC_NbrOfConversion = 2;              //2个转换在规则序列中 
    ADC_Init(ADC3, &ADC_InitStructure);                     //ADC初始化

    //连续模式下通道的配置
    ADC_RegularChannelConfig(ADC3, ADC_Channel_4, 1, ADC_SampleTime_15Cycles);  //PA0,VIN1,通道0,rank=1,表示连续转换中第一个转换的通道
    ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 2, ADC_SampleTime_15Cycles);  //PA1,VIN2,通道1

    ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);  //连续使能DMA
    ADC_DMACmd(ADC3, ENABLE);                          //使能ADC_DMA
    ADC_Cmd(ADC3, ENABLE);                             //开启AD转换器    
}


/*
 * Function    : static void ADCInit_DMA(void)
 * Description : ADC使能DMA模式
 */
static void ADCInit_DMA(void)
{
    DMA_InitTypeDef  DMA_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);  //时钟使能

    //DMA设置
    DMA_InitStructure.DMA_Channel = DMA_Channel_2;                             //选择通道号
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC3->DR);          //外围设备地址,ADC_DR_DATA规则数据寄存器
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(u16 *)AD_Value;         //DMA存储器地址,自己设置的缓存地址
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                    //传输方向:外设到存储器
    DMA_InitStructure.DMA_BufferSize = N*2;                                    //DMA缓存大小,数据传输量N*2
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;           
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                    
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                            //DMA模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                         
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;                       
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;           
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;                 
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;         
    DMA_Init(DMA2_Stream0, &DMA_InitStructure);                                //初始化DMA2_Stream0,对应为ADC3

    //设置DMA中断
    DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TC);   //清除中断标志
    DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);    //传输完成中断                                       
    DMA_Cmd(DMA2_Stream0, ENABLE);                    //使能DMA
}


/*
 * Function    : void ADCInit_Timer(void)
 * Description : ADC触发定时器的设置
 */
void ADCInit_Timer(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  //时钟使能   

    TIM_Cmd(TIM2, DISABLE);                               //失能时钟
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);       //初始化定时器

    TIM_TimeBaseStructure.TIM_Prescaler = 168-1; 
    TIM_TimeBaseStructure.TIM_Period = 200-1; 
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ; 
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 

    //使能定时器中断 
    TIM_ARRPreloadConfig(TIM2, ENABLE);  //允许TIM2定时重载
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);  

    TIM_Cmd(TIM2, ENABLE);               //使能TIM2
}


/*
 * Function    : void ADCInit_Nvic(void)
 * Description : 中断初始化
 */
static void ADCInit_Nvic(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    //定时器中断设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;            //定时器TIM2中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;    
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;          
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                            //根据指定的参数初始化NVIC寄存器

    //DMA中断设置
    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;    //DMA2_Stream0中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
    NVIC_Init(&NVIC_InitStructure);     
}


/*
 * Function    : void  ADCInit(void)
 * Description : ADC初始化函数
 */                                                           
void ADCInit(void)
{
    ADCInit_GPIO();
    ADCInit_DMA();
    ADCInit_ADC();
    ADCInit_Nvic();
        ADCInit_Timer();
}    


/*
 * Function    : void TIM2_IRQHandler(void) 
 * Description : TIM2??????
 */
void TIM2_IRQHandler(void)  
{
    if(TIM_GetITStatus(TIM2, TIM_IT_Update))   
    {         
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 
    }
}


/*
 * Function    : void DMA2_Stream0_IRQHandler(void) 
 * Description : DMA2_Stream0中断
 */
void DMA2_Stream0_IRQHandler(void)  
{
    u16 period = 0;
    if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0))  //判断DMA传输完成中断  
    {
         DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
               ch1=Get_Adc1(AD_Value[0]);
               ch2=Get_Adc1(AD_Value[1]);
             dateFlag=1;

         //判断是否更新TIM2
         if(UpdataTIM)
         {
             period = 200-1;      
             TIM_ARRPreloadConfig(TIM2, DISABLE); 
             TIM2->ARR = period ;       
             TIM_ARRPreloadConfig(TIM2, ENABLE);     
         }
    }
}


double Get_Adc1(u16 adValue)   
{    
    return (double)(adValue * 3.3 / 4096); 
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sEMG项目总结(3)STM32采集肌电信号 的相关文章

  • idea启动android项目时找不到已经运行的genymotion虚拟设备解决方案

    由于刚学习android 按网上说的用另外一个android虚拟设备来运行项目 所以就找到了genymotion 但有个问题就是 启动android项目时 有时能找到运行中的genymotion 有时又找不到 总是这个问题 弄了我好几天 有
  • OpenCV python实现视频的循环播放

    有以下三个步骤 首先设置一个frame的设置参数frame counter 值为0 在读帧时间 将每次加一 当 frame counter达到视频总帧数时 将当前的帧设置为 0 视频总帧数 cv2 CAP PROP FRAME COUNT
  • 关于区块链技术的3大特点,你都了解吗?--甲由

    跟着区块链技术的开展 全球引起了比特币的张狂影响 如果说互联网是信息的高速公路 那么区块链便是金钱的高速公路 它甚至可以加快人们通往财富之路的速度 那么 什么是区块链 区块链起源于中本聪的比特币 作为比特币的底层技术 本质上是一个去中心化的
  • Power bi 3.24 矩阵

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 数据集链接见微信公共号底端 1 单击 可视化 窗格中的 矩阵 图标 在画布区域会出现矩阵的模板 由于没有填入数据 因此矩阵是灰色的 2 在 字段 窗格中勾选 类型 年份 实际产量 预
  • uni-app自定义组件不能使用v-for解决办法

    uni app自定义组件不能使用v for解决办法 原文 添加链接描述
  • matlab三维山峰/山脉/山地曲面数据图

    matlab三维山峰 山脉 山地曲面数据图 可以使用peaks函数 比如直接peaks 80 peaks 80 z 3 1 x 2 exp x 2 y 1 2 10 x 5 x 3 y 5 exp x 2 y 2 1 3 exp x 1 2
  • 前端使用Export2Excel将页面Table中的数据导出为Excel

    前端使用Export2Excel将页面Table中的数据导出为Excel 在项目中 用于需要将表格中的数据导出为Excel 根据用于自己的表头样式 经过千方百计的百度 终于找到了这个Export2Excel 插件 1 安装 需要以下几个插件
  • 7款超级好用的AI智能工具,功能超越你的想象

    分享7个好用的AI智能工具 都是日常能够经常用到的 有了它们可以大大提高工作学习效率 1 Notion AI AI写作 一个AI智能写作在线网站 只需要输入关键词就能快速生成一篇文章 可以大大提高办公学习效率 使用邮箱注册登录之后 在右侧点
  • 中input宽度_使用HOG对卫星图像中的船舶进行分类

    我在浏览Kaggle数据集时发现了这个有趣的机器学习数据集 https www kaggle com rhammell ships in satellite imagery 该机器学习数据集包括从卫星图像中提取的船舶图像以及一些负面实例 查
  • springboot中Controller层调用service层报错this.service is null

    报错信息 2022 10 18 09 11 35 661 ERROR GlobalExceptionHandler java 33 java lang NullPointerException Cannot invoke com yuhen
  • 自动化测试 - Appium + Python史上最全最简环境搭建步骤

    一 为什么是Appium 借一张图 1 1 Appium优点 l 开源 l 跨架构 NativeApp Hybird App Web App l 跨设备 Android iOS Firefox OS l 不依赖源码 l 使用任何WebDri
  • windows杀软在线识别平台

    前言 在内网攻防中 当拿到一个对外服务器权限后 必不可少的就是要上线MSF或者CS进行内网横移 这个时候如果服务器上存在杀软 就会影响木马上线 几款推荐的杀软在线识别平台 1 https www ddosi org av 1 php 2 h
  • postman 设置请求编码_在postman脚本中进行urlencode编码

    进行urlencode编码 在进行接口测试的过程中 一部分接口的参数需要做urlencode编码 如果将传输的参数直接编码进行发送 就无法灵活的修改参数了 也不能灵活使用环境变量 于是想在postman的Pre request Script
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • APP压力测试之Monkey

    文章目录 前言 第一章 概述 1 1 什么是Monkey测试 1 2 Monkey测试的内容是什么 1 3 为什么要进行monkey测试 1 4 Monkey测试的有点是什么 有什么缺点 第二章 环境的搭建 2 1 Android SDK
  • Angular路由 ng-route和ui-router的区别

    什么是路由 路由是AngularJS构建单页面应用的基础 路由 就是网络数据或者请求进行分发的一个网络组件 路由就是一个用于请求URL分发和跳转的一个应用组件 Angular中通过 routeProvider路由服务提供者进行核心的配置处理
  • 软件打包成rpm包的方法

    01 所用软件 打包rpm建议使用fpm软件 fpm软件来源自ruby的生态 安装方式如下 首先安装ruby的环境 yum install ruby devel gcc make rpm build rubygems 再安装fpm软件 ge
  • 常用的国内 PyPI 镜像

    从网上整理一些常用的国内 PyPI 镜像 阿里云 https mirrors aliyun com pypi simple 清华 https pypi tuna tsinghua edu cn simple 中国科技大学 https pyp
  • 个人笔记新解-Obsidian

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 自己之前一直在使用为知笔记 体验越来越糟糕 主要有几个原因 为知笔记的编辑器很难用 尤其是对md的支持很差 最近有备份需求 但是为知笔记新版本竟然去掉导出文件夹功能

随机推荐

  • 安装 Realtek HD Audio Driver 失败 Error Code : 0xE0000100

    更新声卡驱动提示 安装Realtek HD Audio Driver失败 Error Code 0xE0000100 错误 尝试各种版本驱动无效 以下是解决方案 1 下载windows7声卡驱动修复压缩包 直接复制以下下载地址下载 http
  • 我是女生,想进入IT行业难吗?

    女生进入IT职业真的不难 我从事IT职业6年多 身边有许多女同事 她们工资都非常高 她们中有程序员 测验人员 有技能支持人员 有产品司理 有项目司理 有UI规划师等等 她们有的是计算机专业结业的 也有非计算机专业结业的 虽然她们起点的确不太
  • fatal: Not a valid object name: ‘master‘.

    Git创建分支错误 Administrator DESKTOP RL96PC3 MINGW64 e dd master git branch devfatal Not a valid object name master 原因 是因为我们刚
  • 模板方法模式(模板方法设计模式)与回调机制解析

    模板方法是什么 模板方法模式在一个方法中定义一个算法的骨架 将某些步骤推迟到子类中实现 模板方法模式可以让子类在不改变算法整体的结构情况下 重新定义算法中的某些步骤 public abstract class AbstractClass p
  • 图的基础定义

    连通分量 相互可达的结点称为一个连通分量 割顶 删除某个点后 使图不再联通 桥 删除某个边后 使图不再联通 双连通 任意两点之间至少存在两条 点不重复 的路径 此时内部无割顶 双连通分量 点 双连通的一个极大子图 BCC 边 双连通分量 边
  • SDMG-R模型学习笔记

    商汤出的算法 用于关键信息提取 KIE 集成在mmocr包里 需要搭配mmcv一起使用 本文将结合论文 源码对模型结构进行一个梳理 题外话 mmcv用了hook编程 调试起来还是蛮难的 以后有空再分享下mmcv的框架逻辑 模型结构 整体结构
  • jira数据迁移过程

    jira数据迁移是常见的软件开发过程中遇到的问题 在数据迁移过程中下面讲解简单的过程 1 配置好jdk 2 配置好mysql数据库 3 配置好jira 4 在mysql中创建一个数据库 必须在创建时设置好数据库的字符集 为这个数据库创建一个
  • web前端入门到实战:CSS3 filter(滤镜)属性

    css3的滤镜filter属性 可以对网页中的图片进行类似Photoshop图片处理的效果 例如背景的毛玻璃效果 老照片 黑白照片 火焰效果等 一 blur px 高斯模糊 二 brightness 亮度 三 contrast 对比度 四
  • 通过Visio软件的宏编写Java代码

    1 新建Visio文件并打开 2 在 开发工具 选项卡上 单击 录制宏 3 操作Visio 如画图 画线等 4 点击停止录制 5 点击宏 6 可以查看到VB窗口的代码 可以一步步调试 根据宏代码尝试编写Java代码 一般情况下 宏中使用的代
  • 阿里面试题:为什么Map桶中个数超过8才转为红黑树

    这是一个好友面试阿里时 被问到的一个问题 应该不少人看到这个问题都会一面懵逼 因为 大部分的文章都是分析链表是怎么转换成红黑树的 但是并没有说明为什么当链表长度为8的时候才做转换动作 第一反应也是一样 只能初略的猜测是因为时间和空间的权衡
  • CloudQuery:更好地管理你的 OceanBase 数据库

    前言 作为 OceanBase 的生态合作伙伴 CloudQuery 简称 CQ 最新发布的社区版 2 2 0 新增了 OceanBase 数据库 为企业使用 OceanBase 数据库提供全面的支持 包括连接与认证 查询与分析 数据安全与
  • 软件测试开发和软件测试有什么区别?

    软件测试 软件测试是在测试中识别软件产品和 服务的准确性和质量的过程 显然 它的诞生是为了验证产品是否满足客户的特定先决条件和需求 在一天的工作结束前 确定特定的较终目标并测试执行一个框架或应用程序 以指出其错误 或缺陷 测试的职责是找到b
  • 颜色值透明度的百分数对应十六进制表

    目录 颜色简介 1 透明度的计算 2 透明度和不透明度的转换 3 透明度对应的十六进制值 4 不透明度对应的十六进制值 颜色简介 Android中的颜色值通常遵循RGB ARGB标准 使用时通常以 字符开头 以16进制表示 常用的颜色值格式
  • UDP协议详解

    文章目录 UDP概述 UDP主要特点 TCP和UDP区别 应用 适用场合 实际应用 代码演示 总结 UDP概述 UDP 是User Datagram Protocol的简称 中文名是用户数据报协议 是OSI Open System Inte
  • windows11文件夹共享设置 如何共享 如何访问

    一 确保文件夹共享相关服务处于启动状态 按快捷键Windows R 输入services msc 回车打开服务 确保以下服务都开启 需要全部开启后才能保证共享正常 1 DNS Client DNS 客户端服务 dnscache 缓存域名系统
  • 使用pip install -r requirements安装库出现的问题

    1 问题描述 ERROR No matching distribution found for matplotlib gt 3 2 2 WARNING There was an error checking the latest versi
  • redis五大数据类型+redis6 新类型(详解+指令)

    redis有五大数据类型分别是 1 String 字符串 2 List 列表 3 Set 集合 4 Hash 哈希 5 Zset 有序集合sorted set redis6 三种新数据类型 1 Bitmaps 实现对位的操作 以位为单位的数
  • SpringBoot配置postgre多数据源(亲测有效!!!)

    参考 https blog csdn net weixin 43240792 article details 106571925 稍微有一些不一样 pom引用
  • 蓝桥杯 试题 算法训练 最小距离 ( C++ )

    最小距离 最小距离 算法题目 算法代码 算法的核心思路 最小距离 算法题目 资源限制 时间限制 1 0s 内存限制 256 0MB 最小距离 问题描述 数轴上有n个数字 求最近的两个数 即min abs x y 输入格式 第一行包含一个整数
  • sEMG项目总结(3)STM32采集肌电信号

    STM32采集肌电信号 目录 STM32采集肌电信号 目录 1采集方式ADCTimerDMA 2采集程序的配置 3对采集的sEMG的分析 4STM32F407源码 1采集方式ADC Timer DMA 1 肌电信号采集板有双通道 信号的放大