GD 32 滤波算法

 快速排序知识补充

http://t.csdnimg.cn/gVOsoicon-default.png?t=N7T8http://t.csdnimg.cn/gVOso


 GD32硬件滤波算法

 程序代码:

#include <stdint.h>
#include <stdio.h>
#include "gd32f30x.h"
#include "delay.h"static void GpioInit(void)
{rcu_periph_clock_enable(RCU_GPIOC);gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
}static void AdcInit(void)
{/* 使能时钟;*/rcu_periph_clock_enable(RCU_ADC0);/* 设置分频系数;*/rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);  // 6分频,120MHz / 6 = 20MHz/* 设置独立模式;*/adc_mode_config(ADC_MODE_FREE);/* 设置单次模式;*/ adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);/* 设置数据对齐;*/adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);/* 设置转换通道个数;*/ adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);/* 设置转换哪一个通道以及所处序列位置;*/ adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_12, ADC_SAMPLETIME_239POINT5);  // PC2对应通道12,放在序列寄存器的0序列中,239.5个周期/* 设置选择哪一个外部触发源;*/ adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);/* 使能外部触发;*/ adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);/* 设置硬件滤波;*/ adc_oversample_mode_config(ADC0, ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_8B, ADC_OVERSAMPLING_RATIO_MUL16);adc_oversample_mode_enable(ADC0);/* 使能ADC;*/ adc_enable(ADC0);/* 内部校准;*/ DelayNus(50);adc_calibration_enable(ADC0);adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}/**
***********************************************************
* @brief ADC硬件初始化
* @param
* @return 
***********************************************************
*/
void VresDrvInit(void)
{GpioInit();AdcInit();
}uint16_t GetAdcVal(void)
{while (!adc_flag_get(ADC0, ADC_FLAG_EOC));return adc_regular_data_read(ADC0);
}void VresDrvTest(void)
{uint16_t AdcVal = GetAdcVal();float Voltage = (float)AdcVal / 4095 * 3.3f;printf("AdcVal = %d, Voltage = %.1f.\n", AdcVal, Voltage);DelayNms(1000);
}

实验结果:


GD 32 软件滤波算法

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "gd32f30x.h"
#include "delay.h"#define ADC0_RDATA_ADDR    (ADC0 + 0x4C)#define MAX_BUF_SIZE        10
static uint16_t g_adcVal[MAX_BUF_SIZE];static void GpioInit(void)
{rcu_periph_clock_enable(RCU_GPIOC);gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
}static void AdcInit(void)
{/* 使能时钟;*/rcu_periph_clock_enable(RCU_ADC0);/* 设置分频系数;*/rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);  // 6分频,120MHz / 6 = 20MHz/* 设置独立模式;*/adc_mode_config(ADC_MODE_FREE);/* 设置连续模式;*/ adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);/* 设置扫描模式;*/ adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);/* 设置数据对齐;*/adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);/* 设置转换通道个数;*/ adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);/* 设置转换哪一个通道以及所处序列位置;*/ adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_12, ADC_SAMPLETIME_239POINT5);  // PC2对应通道12,放在序列寄存器的0序列中,239.5个周期/* 设置选择哪一个外部触发源;*/ adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);/* 使能外部触发;*/ adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);/* 使能ADC的DMA功能;*/ adc_dma_mode_enable(ADC0);/* 使能ADC;*/ adc_enable(ADC0);/* 内部校准;*/ DelayNus(50);adc_calibration_enable(ADC0);adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}static void DmaInit(void)
{/* 使能DMA时钟;*/rcu_periph_clock_enable(RCU_DMA0);/* 复位DMA通道;*/dma_deinit(DMA0, DMA_CH0);dma_parameter_struct dmaStruct;dma_struct_para_init(&dmaStruct);/* 配置传输方向;*/ dmaStruct.direction = DMA_PERIPHERAL_TO_MEMORY;/* 配置数据源地址;*/ dmaStruct.periph_addr = ADC0_RDATA_ADDR;/* 配置源地址是固定的还是增长的;*/ dmaStruct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;/* 配置源数据传输位宽;*/ dmaStruct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;/* 配置数据目的地址;*/dmaStruct.memory_addr = (uint32_t)g_adcVal;/* 配置目的地址是固定的还是增长的;*/ dmaStruct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;/* 配置目的数据传输位宽;*/ dmaStruct.memory_width = DMA_MEMORY_WIDTH_16BIT;/* 配置数据传输最大次数;*/ dmaStruct.number = MAX_BUF_SIZE;/* 配置DMA通道优先级;*/ dmaStruct.priority = DMA_PRIORITY_HIGH;dma_init(DMA0, DMA_CH0, &dmaStruct);/* 使能DMA循环模式搬移数据;*/ dma_circulation_enable(DMA0, DMA_CH0);/* 使能DMA通道;*/ dma_channel_enable(DMA0, DMA_CH0);
}/**
***********************************************************
* @brief ADC硬件初始化
* @param
* @return 
***********************************************************
*/
void VresDrvInit(void)
{GpioInit();AdcInit();DmaInit();
}/**
***********************************************************
* @brief 算术平均滤波
* @param arr,数组首地址
* @param len,元素个数
* @return 平均运算结果
***********************************************************
*/
static uint16_t AirthAvgFltr(uint16_t *arr,uint32_t len)
{uint32_t sum = 0;for(uint32_t i = 0; i < len; i++){sum += arr[i];}return (uint16_t)(sum / len);
}void VresDrvTest(void)
{// 定义一个临时数组uint16_t buf[MAX_BUF_SIZE];// 使用中间变量接收对应的值,第三个参数是拷贝的空间大小memcpy(buf,g_adcVal,sizeof(uint16_t) * MAX_BUF_SIZE);// 使用for循环打印输出uint8_t i = 0;for(i = 0; i < MAX_BUF_SIZE; i++){printf("AdcVal[%d] = %d.\n", i, buf[i]);}// 调用算数平均滤波算法的接口函数uint16_t res = AirthAvgFltr(buf,MAX_BUF_SIZE);printf("res = %d.\n", res);DelayNms(1000);
}

实验结果:


GD32 快排实现平均滤波算法

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "gd32f30x.h"
#include "delay.h"#define ADC0_RDATA_ADDR    (ADC0 + 0x4C)#define MAX_BUF_SIZE        10
static uint16_t g_adcVal[MAX_BUF_SIZE];static void GpioInit(void)
{rcu_periph_clock_enable(RCU_GPIOC);gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
}static void AdcInit(void)
{/* 使能时钟;*/rcu_periph_clock_enable(RCU_ADC0);/* 设置分频系数;*/rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);  // 6分频,120MHz / 6 = 20MHz/* 设置独立模式;*/adc_mode_config(ADC_MODE_FREE);/* 设置连续模式;*/ adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);/* 设置扫描模式;*/ adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);/* 设置数据对齐;*/adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);/* 设置转换通道个数;*/ adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);/* 设置转换哪一个通道以及所处序列位置;*/ adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_12, ADC_SAMPLETIME_239POINT5);  // PC2对应通道12,放在序列寄存器的0序列中,239.5个周期/* 设置选择哪一个外部触发源;*/ adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);/* 使能外部触发;*/ adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);/* 使能ADC的DMA功能;*/ adc_dma_mode_enable(ADC0);/* 使能ADC;*/ adc_enable(ADC0);/* 内部校准;*/ DelayNus(50);adc_calibration_enable(ADC0);adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}static void DmaInit(void)
{/* 使能DMA时钟;*/rcu_periph_clock_enable(RCU_DMA0);/* 复位DMA通道;*/dma_deinit(DMA0, DMA_CH0);dma_parameter_struct dmaStruct;dma_struct_para_init(&dmaStruct);/* 配置传输方向;*/ dmaStruct.direction = DMA_PERIPHERAL_TO_MEMORY;/* 配置数据源地址;*/ dmaStruct.periph_addr = ADC0_RDATA_ADDR;/* 配置源地址是固定的还是增长的;*/ dmaStruct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;/* 配置源数据传输位宽;*/ dmaStruct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;/* 配置数据目的地址;*/dmaStruct.memory_addr = (uint32_t)g_adcVal;/* 配置目的地址是固定的还是增长的;*/ dmaStruct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;/* 配置目的数据传输位宽;*/ dmaStruct.memory_width = DMA_MEMORY_WIDTH_16BIT;/* 配置数据传输最大次数;*/ dmaStruct.number = MAX_BUF_SIZE;/* 配置DMA通道优先级;*/ dmaStruct.priority = DMA_PRIORITY_HIGH;dma_init(DMA0, DMA_CH0, &dmaStruct);/* 使能DMA循环模式搬移数据;*/ dma_circulation_enable(DMA0, DMA_CH0);/* 使能DMA通道;*/ dma_channel_enable(DMA0, DMA_CH0);
}/**
***********************************************************
* @brief ADC硬件初始化
* @param
* @return 
***********************************************************
*/
void VresDrvInit(void)
{GpioInit();AdcInit();DmaInit();
}/**
***********************************************************
* @brief 算术平均滤波
* @param arr,数组首地址
* @param len,元素个数
* @return 平均运算结果
***********************************************************
*/
static uint16_t AirthAvgFltr(uint16_t *arr,uint32_t len)
{uint32_t sum = 0;for(uint32_t i = 0; i < len; i++){sum += arr[i];}return (uint16_t)(sum / len);
}/**
***********************************************************
* @brief qsort函数调用的回调函数,比较规则,降序排列
* @param *_a,对应数组元素
* @param *_b,对应数组元素
* @return 比较结果
***********************************************************
*/
int32_t CmpCb(const void* _a, const void* _b)
{uint16_t* a = (uint16_t*)_a;uint16_t* b = (uint16_t*)_b;int32_t val = 0;if (*a > *b){val = -1;}else if (*a < *b){val = 1;}else{val = 0;}return val;
}/**
***********************************************************
* @brief 中位值平均滤波
* @param arr,数组首地址
* @param len,元素个数,需要大于等于3个
* @return 平均运算结果
***********************************************************
*/
static uint16_t MedianAvgFltr(uint16_t *arr,uint32_t len)
{qsort(arr,len,sizeof(uint16_t),CmpCb);printf("\n after qsort.\n");for(uint8_t i = 0; i < len; i++){printf("AdcVal[%d] = %d.\n",i,arr[i]);}return AirthAvgFltr(&arr[1],len-2);
}void VresDrvTest(void)
{// 定义一个临时数组uint16_t buf[MAX_BUF_SIZE];// 使用中间变量接收对应的值,第三个参数是拷贝的空间大小memcpy(buf,g_adcVal,sizeof(uint16_t) * MAX_BUF_SIZE);// 使用for循环打印输出uint8_t i = 0;for(i = 0; i < MAX_BUF_SIZE; i++){printf("AdcVal[%d] = %d.\n", i, buf[i]);}// 调用算数平均滤波算法的接口函数uint16_t res = MedianAvgFltr(buf,MAX_BUF_SIZE);printf("res = %d.\n", res);DelayNms(1000);
}

 排序结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/388797.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目实战_表白墙(简易版)

你能学到什么 一个比较简单的项目&#xff1a;表白墙&#xff08;简易版&#xff09;&#xff0c;浏览器&#xff1a;谷歌升级版将在下个博客发布 效果如下 正文 说明 我们是从0开始一步一步做这个项目的&#xff0c;里面的各种问题&#xff0c;我也会以第一人称视角来解…

经验分享:大数据多头借贷风险对自身的不利影响?

在现代金融体系中&#xff0c;大数据技术的应用使得多头借贷成为一种普遍现象。多头借贷指的是个人或企业在短时间内同时或近期内申请多笔贷款或信用产品&#xff0c;这种行为可能带来一系列财务和信用风险。以下是大数据多头借贷风险对个人自身可能产生的不利影响&#xff1a;…

如何编写一个多线程、非阻塞的python代码

一、【写在前面】 最近csdn每天写两篇文章有推广券&#xff0c;趁这个机会写一个python相关的文章吧。 一般我们的任务都可以分为计算密集型任务和IO密集型任务。 python因为全局GIL锁的存在&#xff0c;任何时候只有一个python线程在运行&#xff0c;所以说不能利用多核CPU…

数字的位操作——326、504、263、190、191、476、461、477、693

326. 3 的幂&#xff08;简单&#xff09; 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3x 示例 1&#xff1a; 输入&a…

程序员面试题------N皇后问题算法实现

N皇后问题是一个著名的计算机科学问题&#xff0c;它要求在NN的棋盘上放置N个皇后&#xff0c;使得它们之间不能相互攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题可以看作是一个回溯算法问题&#xff0c;通过逐步尝试不同的放置位置&#xf…

订单状态统计业务

文章目录 概要整体架构流程技术细节小结 概要 订单状态统计是电子商务、供应链管理、客户服务等多个领域中的一项核心业务需求. 需求分析以及接口设计 技术细节 1.Controller层: ApiOperation("各个状态的订单统计")GetMapping("/statistics")public Re…

检索增强生成(RAG):智能内容生成的新纪元

引言 在大 AI 时代&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;模型&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;&#xff0c;已经展现出了令人瞩目的能力。然而&#xff0c;这些模型在提供信息的准确、即时、专业、权威等方面仍存在局限。检索增…

用Python打造精彩动画与视频,3.2 基本的剪辑和合并操作

3.2 基本的剪辑和合并操作 在这一节中&#xff0c;我们将学习如何使用 MoviePy 库对视频进行基本的剪辑和合并操作。MoviePy 是一个用于视频编辑的 Python 库&#xff0c;可以轻松地实现视频的剪辑、合并、添加音频等操作。 准备工作 首先&#xff0c;确保你已经安装了 Movi…

c++----类与对象(下)

当我们简单的学习了上一篇日期类。简单的理解并且使用了我们前面学习的知识。当然这还只是我们c的九牛一毛。并且我们的类与对象的知识还没学习完。今天我们来把类与对象的知识完善一下。 初始化列表 那么今天我们就不讲废话了&#xff0c;我们直接来主题。首先我们可以看到我…

防火墙Firewalld(iptables)

目录 一、Linux防火墙基础 1.什么是防火墙 2.防火墙的功能 3.防火墙的类型 二、Linux防火墙工具 1.iptables 2. netfilter 3.四表五链结构 3.1四表 3.2五链 3.3总结 4.数据包过滤的匹配流程 4.1规则表之间的顺序 4.2规则链之间的顺序 4.3规则链内的匹配顺序 …

项目实战_表白墙(升级版)

你能学到什么 表白墙&#xff08;升级版&#xff09;Mybatis的一些简单应用 正文 前⾯的案例中, 我们写了表⽩墙, 但是⼀旦服务器重启, 数据就会丢失. 要想数据不丢失, 需要把数据存储在数据库中&#xff0c;接下来咱们借助MyBatis来实现数据库的操作。 数据准备 如果我们…

Kubernetes Prometheus 系列 | AlertManager实现企业微信报警

helm部署prometheusgrafana直通车&#xff08;与本文章关联&#xff09; 首先注册企业微信&#xff1a;https://work.weixin.qq.com/ 目录 一、第一种根据企业id&#xff0c;应用secret等绑定二、第二种方式-添加群聊天机器人webhook&#xff08;推荐&#xff09; 前言&#x…

AI Agent学习系列:利用扣子智能体快速生成字体大小可控的金句海报

像这样的金句海报是如何生成的&#xff1f; 利用智能体可以轻松实现&#xff0c;还能控制字体大小&#xff0c;下面就介绍这个智能体的搭建过程。 一、创建扣子bot 打开扣子&#xff0c;点击“创建Bot”&#xff0c;手动创建一个bot。 在Bot创建页面输入Bot名称&#xff0c;比…

【项目实战】—— 高并发内存池

文章目录 什么是高并发内存池&#xff1f;项目介绍一、项目背景二、项目目标三、核心组件四、关键技术五、应用场景六、项目优势 什么是高并发内存池&#xff1f; 高并发内存池是一种专门设计用于高并发环境下的内存管理机制。它的原型是Google的一个开源项目tcmalloc&#xff…

SAP MM学习笔记50 - 分割评价(分别评估)

上一章讲了两个不太常用的物料类型&#xff0c;UNBW 和 NLAG。 学它的主要目的就是应付客户&#xff0c;因为根本就不好用&#xff0c;而客户还会很好奇的问这是啥东西呢&#xff1f; SAP MM学习笔记49 - UNBW - 非评价品目&#xff08;未评估物料&#xff09;&#xff0c;NL…

【Golang 面试 - 基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

主题巴巴WordPress主题合辑打包下载+主题巴巴SEO插件

主题巴巴WordPress主题合辑打包下载&#xff0c;包含博客一号、博客二号、博客X、门户一号、门户手机版、图片一号、杂志一号、自媒体一号、自媒体二号和主题巴巴SEO插件。

【LLM大模型】AI大模型大厂面试真题:「2024大厂大模型技术岗内部面试题+答案」

AI大模型岗的大厂门槛又降低了&#xff01;实在太缺人了&#xff0c;大模型岗位真的强烈建议各位多投提前批&#xff0c;▶️众所周知&#xff0c;2025届秋招提前批已经打响&#xff0c;&#x1f64b;在这里真心建议大家6月7月一定要多投提前批&#xff01; &#x1f4bb;我们…

html实现酷炫美观的可视化大屏(十种风格示例,附源码)

文章目录 完整效果演示1.蓝色流线风的可视化大屏1.1 大屏效果1.2 大屏代码1.3 大屏下载 2.地图模块风的可视化大屏2.1 大屏效果2.2 大屏代码2.3 大屏下载 3.科技轮动风的可视化大屏3.1 大屏效果3.2 大屏代码3.3 大屏下载 4.蓝色海洋风的可视化大屏4.1 大屏效果4.2 大屏代码4.3 …

createObjectURL的部分使用讲解

URL.createObjcetURL的部分详解 文章目录 URL.createObjcetURL的部分详解1. 为什么要使用createObjectURL2. createObjectURL的基本用法3. 转换后的文件进行展示或下载展示下载 首先&#xff0c;想记录一下这点是因为之前关于pdf文件的下载和预览&#xff0c;后端返回工作流时的…