【沧海拾昧】Proteus8仿真stm32:ADC转换程序

2023-10-26

#C0102


沧海茫茫千钟粟,且拾吾昧一微尘

——《沧海拾昧集》@CuPhoenix


【阅前敬告】

沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系

如有问题必是本集记录有谬,切勿深究


目录

一、原理图绘制

二、多位七段数码管

三、ADC引脚

四、代码

 五、仿真问题


一、原理图绘制

ADC转换程序电路原理图

         

图中所用到的元件和元件在库中的名称对照表如下:

元件名 库中名称
可变电阻 POT-HG
STM32F103R6 STM32F103R6
4位7段共阴数码管 7SEG-MPX4-CC
高电平 POWER
GROUND

二、多位七段数码管

1、共阴管是CC,共阳管是CA,对应的译码表如下。

数码管译码表

2、输入信号A~G、DP的有效信号看是共阴还是共阳,对应的片选信号1~4是低电平有效,从左到右依次为第1位至第4位。

片选位数 1 2 3 4
片选码 0x0e00 0x0d00 0x0b00 0x0700


3、输出的示例。数字码0x6f,片选码0x0e00,输出码即二者相加0x0e6f。

GPIO_Write(GPIOC, 0x0e6f );
在第1位输出“9”

4、输出用的函数GPIO_Write的定义如下,适用于对统一端口的多个引脚的写入。

void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t ProtVal)

5、多位七段管输出的方法是动态扫描,即逐位输出。在每位输出前面加一个短暂的延时函数,然后清零引脚,动态扫描输出就不会闪烁了。示例如下(在第一位片选码使用0x0e80,加了个小数点)。

 先定义好译码表待查。

const uint16_t SegmentCodes[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const uint16_t SegmentBit[]={0x0e80,0x0d00,0x0b00,0x0700};

输出内容。

uint16_t temp = 1234;
                        // 输出内容:1234
uint16_t unit[4];
unit[0] = temp / 1000;
unit[1] = temp % 1000 / 100;
unit[2] = temp % 100 / 10;
unit[3] = temp % 10;
                        // 位数拆分
int i = 0;
for(i=0;i<4;i++){
    delay();
    GPIO_Write(GPIOC, 0x0f00 );
    GPIO_Write(GPIOC, SegmentCodes[unit[i]]+SegmentBit[i] );
}
                        // 循环输出各位

短暂的延时。

void delay(){
	int i=0,j=0;
	for(i=0;i<5;i++){
		for(j=0;j<100;j++){}
	}
}

仿真结果。 

动态扫描输出四位

三、ADC引脚

ADC通道对应的引脚必须正确
图源 @夜路难行々

四、代码

#include "stm32f10x.h"

#define ADC1_DR_Address ((uint32_t)0x4001244C)

ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
__IO uint16_t ADCConvertedValue;
ErrorStatus HSEStartUpStatus;
const uint16_t SegmentCodes[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
                                        // 共阴数码管 0 ~ 9 查码表
const uint16_t SegmentBit[]={0x0e80,0x0d00,0x0b00,0x0700}; 
                                        // 片选 1 ~ 4 查码表

void RCC_Configuration();  // RCC初始化
void GPIO_Configuration();  // GIPO初始化
void delay();


int main(void){
	RCC_Configuration();  
	GPIO_Configuration();
	
	DMA_DeInit(DMA1_Channel1);  // DMA初始化
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  // 外设地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;  // 存储器地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 1;  // 传输计数器的大小
    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_InitStructure.DMA_Priority = DMA_Priority_High;  // 优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  // 软件触发
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
	
	DMA_Cmd(DMA1_Channel1, ENABLE);
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  // 单ADC触发
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;  // 连续扫描 否
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  // 连续转换 是
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  // 外部中断 否
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  // 右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;  // 通道个数
    ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
                            // 选择规则组的输入通道,ADC1通道1,采样时钟55.5个周期
	
	ADC_DMACmd(ADC1, ENABLE);
	
	ADC_Cmd(ADC1, ENABLE);  // ADC1使能
	
	ADC_ResetCalibration(ADC1);  
	while(ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);  // 校准ADC
	while(ADC_GetCalibrationStatus(ADC1));
	
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);  // 软件触发ADC
	
	while (1){
		uint16_t temp;
		int i = 0;
		uint16_t unit[4];
		temp = (uint16_t)(((double)(ADCConvertedValue) / (double)0xfff ) * (double)3210);
		//temp = ADCConvertedValue;
		unit[0] = temp / 1000;
		unit[1] = temp % 1000 / 100;
		unit[2] = temp % 100 / 10;
		unit[3] = temp % 10;
		for(i=0;i<4;i++){
				delay();
				GPIO_Write(GPIOC, 0x0f00 );
				GPIO_Write(GPIOC, SegmentCodes[unit[i]]+SegmentBit[i] );
		}
  }

	return 0;
	
}

void RCC_Configuration()
{
	SystemInit();
  RCC_DeInit();

  RCC_HSEConfig(RCC_HSE_ON);

  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_2);
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_ADCCLKConfig(RCC_PCLK2_Div4); 
  
#ifndef STM32F10X_CL  
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);

#else
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
    RCC_PLL2Config(RCC_PLL2Mul_8);
    RCC_PLL2Cmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
    {}
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_7);
			
#endif
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
	
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
}

void GPIO_Configuration()
{
  GPIO_InitTypeDef GPIO_InitStructure;
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{ 
  while (1)
  {
  }
}
#endif

void delay(){
	int i=0,j=0;
	for(i=0;i<5;i++){
		for(j=0;j<100;j++){}
	}
}


 五、仿真问题

输出没有值

         仿真遇到问题。无论如何调节输入,ADC的输出均为0。只有在ADC接VDD时,输出为4095(最大值),接与VDD值相等的激励源值也为0。疑似是ADC没有供电。

        网上的两种解决方法均无效:

        ① 如下配置供电网:

供电网 网络连接到供电网
GND GND / VSS / VSSA
VCC / VDD(电压3.3V) VDD / VDDA
VEE -

        ② 使用高版本的Proteus:有说法8.11可以,8.9不行,但笔者用的8.13也不行。

        此问题悬而未决,若有大神路过欢迎赐教!

敬谢诸君。


京华西山之巅。

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

【沧海拾昧】Proteus8仿真stm32:ADC转换程序 的相关文章

  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 【Proteus仿真】【Arduino单片机】视力保护仪

    文章目录 一 功能简介 二 软件设计 三 实验现象 联系作者 一 功能简介 本项目使用Proteus8仿真Arduino单片机控制器 使LCD1602液晶 DS18B20温度传感器 按键 蜂鸣器 继电器开关 HC05蓝牙模块等 主要功能 系
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐

  • 一文了解websocket全双工通信java实现&socket地址404问题解决

    websocket介绍 1 websocket介绍 1 1注解介绍 2 demo 2 1 后端代码 2 2 前端代码 2 3 效果 附录 socket地址404问题解决 1 websocket介绍 WebSocket是一种在单个TCP连接上
  • 背包问题

    一 01背包 题目 有一个容量为T的背包 现有n个物品 每个物品有都有一个体积w i 和自身价值v i 现在要求求出背包能够装的物品的价值最大 每个物品只可以装一次 基本思路 01背包是背包中的最基础的问题 后面很多背包问题都是01背包和完
  • [会议分享]2022年欧洲计算机科学与信息技术会议(ECCSIT 2022)

    2022年欧洲计算机科学与信息技术会议 ECCSIT 2022 重要信息 会议网址 www eccsit org 会议时间 2022年11月25 27日 召开地点 南京 截稿时间 2022年10月20日 录用通知 投稿后2周内 收录检索 E
  • 【DevOps核心理念基础】3. 敏捷开发最佳实践

    一 敏捷开发最佳实践 1 1 项目管理 1 2 需求管理 1 3 技术架构 1 4 技术开发 1 5 测试 二 敏捷开发最佳实践 2 1 敏捷开发的执行细节 三 全面的DevOps工具链 四 版本控制和协作开发工具 4 1 集中式版本控制工
  • SX1281驱动学习笔记一:Lora驱动移植

    目录 一 资料下载 1 中文手册下载地址 2 英文手册下载地址 3 固件下载地址 4 SX1281的速率计算器下载地址 5 SX128X区别 二 驱动讲解 1 radio h文件 2 sx1281 c文件 3 sx1281 hal c文件
  • unity在同屏幕显示多Camera并在脚本中修改Viewport Rece

    参考 https www it610 com article 1305219586412548096 htm 参考 https www zhihu com question 41879088 sort created 修改Camera的Vi
  • 开放平台认证方案

    背景 本次的直接起因是第三方那边接入系统后端引起的 第三方方觉得认证要过期比较麻烦 而且要用账号密码去调登录接口去刷token 设计不合理 客观来说 凭本人使用过其它开放平台来说确实有些不一样 常见的一些开放平台 有带web的 一般web能
  • 感知机及算法实现

    1 感知机二类分类的线性分类模型 输入为实例的特征向量 输出为实例的类别 取 1和 1二值 感知机对应于输入空间中将实例划分为正负两类的分离超平面 属于判别模型 感知机学习旨在求出将训练数据进行线性划分的分离超平面 为此导入基于误分类的损失
  • error: use of deleted function

    本文案例仅供参考 出错的代码如下 TEST Test test1 TestImpl impl TestImpl para1 para2 ASSERT EQ jkj impl func 22 33 44 实际应该这样 TEST Test te
  • PyCharm下载包出错

    PyCharm安装成功之后添加所需的包 File gt Settings gt Project 此处是你的Python工作环境 gt Project Interpreter 红色剪头所指 添加需要的包 点开时候出现错误信息 Error lo
  • phpstorm运行php出现502 Bad Gateway

    个人博客开通啦 功能正在逐步完善中 大家可以访问http www codeliu com 记一次心碎的经历 我用的phpstorm10 0 1 XAMPP 今天写完一个php文件后 运行出现502 Bad Gateway的错误 明明上一刻还
  • c语言中的常见数据类型

    一 常见的数据类型包括基本类型 枚举类型 空类型和派生类型 基本类型又包括整型类型 浮点类型 整型类型 基本类型 int 短整型 short int 长整型 long int 双长整型 long long int 字符型 char 布尔型
  • 判断一个字符是否是十六进制

    判断一个字符是否是十六进制 十六进制 hexadecimal 是计算机中数据的一种表示方法 意思是逢十六进一 十六进制数以16为基数 采用的数码是0 1 2 3 4 5 6 7 8 9 A B C D E F 其中A F分别表示十进制数字1
  • JAVA中的异常处理

    一 什么是异常 异常是指在程序执行过程中出现的错误或异常情况 它可能是由于错误的输入 无效的操作 资源不可用等原因引起的 当程序遇到异常时 它会中断当前的执行路径 并转到能够处理该异常的代码块 在 Java 中 异常是以对象的形式表示的 它
  • PID串行多闭环控制与并行多闭环控制的优缺点分析和应用比较

    导言 在自动控制领域 PID控制器是一种经典的控制策略 被广泛应用于各种工业和非工业过程 随着控制系统的复杂性增加 PID串行多闭环控制和PID并行多闭环控制成为解决复杂控制问题的重要方法 本文将从优点和缺点的角度对这两种控制策略进行对比
  • Android基础之Fragment

    目录 前言 一 Fragment简介 二 Fragment的基础使用 1 创建Fragment 2 在Activity中加入Fragment 1 在Activity的layout xml布局文件中静态添加 2 在Activity的 java
  • 数学建模--粒子群算法(PSO)的Python实现

    目录 1 开篇提示 2 算法流程简介 3 算法核心代码 4 算法效果展示 1 开篇提示 开篇提示 这篇文章是一篇学习文章 思路和参考来自 https blog csdn net weixin 42051846 article details
  • 宝峰对讲机16频率表_宝峰888S对讲机的16个信道频率是多少?

    1 宝峰888S对讲机 16个工作频率范围为 400 470MHZ 16个信道 频率范围内 任意频道任意频率 内 2 一般对讲机没容有固定频点 出厂都是空频机器 每个信道的频率都可以写成机器频率范围内的任意频点也可以空白什么都不写 3 根据
  • 矩阵求逆四种方法

    注 用A B表示某矩阵 E表示单位矩阵 用A 表示A逆 用 A 表示A的行列式 A E 表示拼接矩阵 一 公式法 先求A行列式结果 再求A伴随矩阵 最后再求A逆矩阵 A 0 则 A A A 注 图片中detA就是 A 二 初等变换法 A E
  • 【沧海拾昧】Proteus8仿真stm32:ADC转换程序

    C0102 沧海茫茫千钟粟 且拾吾昧一微尘 沧海拾昧集 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 切勿深究 目录 一 原理图绘制 二 多位七段数码管 三 ADC引脚