PY32F003F18之比较器问题

2023-09-21 08:50:22

PY32F003F18的模拟模块,其内部参考电压容易受到电源电压影响。当我连接"USB转串口的RXD"时,PC接收到模拟数据均正常;当我连接“USB转串口的TXD”时,发现内部参考电压的AD值为0xFFF。断开连接的“USB转串口的TXD”,模拟功能模块又恢复正常。于是用万用表测量“USB转串口的TXD”的电压,开路电压为5V,CPU电压为3.3V。难道是因为接入这个TXD导线的原因吗?经过反复测试,AD转换和模拟比较器都会受到这个电压影响。

 

 测试代码:

COMP比较器功能:
比较器正端输入:PA1
比较器负端输入:VREFINT
比较器的输出端口:PA6作为
通过调整PA1上的输入电压,观测PA6引脚上的电平变化

使用步骤:
1. 配置PA1输入电压小于1.1V,检测PA06应该输出低电平,
2. 配置PA1输入电压大于1.3V,检测PA06应该输出高电平。
3. 每进一次比较器中断,翻转PB5

#include "Comparator.h"
#include "LED.h"

/*
COMP比较器功能:
比较器正端输入:PA1
比较器负端输入:VREFINT
比较器的输出端口:PA6作为
通过调整PA1上的输入电压,观测PA6引脚上的电平变化

使用步骤:
1. 配置PA1输入电压小于1.1V,检测PA06应该输出低电平,
2. 配置PA1输入电压大于1.3V,检测PA06应该输出高电平。
3. 每进一次比较器中断,翻转PB5
*/

COMP_HandleTypeDef  hcomp1;

void Comparator_Init(void);
void TIM1_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc);

//函数功能:TIM1中基本计数功能,并使能了更新中断,每次重装ARR值时会产生一次更新中断
//arr:自动重装值。
//psc:时钟预分频数
//TIM1_COUNTERMODE_UP_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;
//TIM1_COUNTERMODE_UP_Init(20000,80);//若使用HSI,当arr=20000,psc=80时,则为200ms,误差为10us;
void TIM1_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc)
{
	TIM_HandleTypeDef  TIM1_HandleStructure;

//HAL_TIM_Base_MspInit开始/
  __HAL_RCC_TIM1_CLK_ENABLE();                          //使能TIM1时钟
  HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0); //设置中断优先级
  HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);         //使能TIM1中断
//HAL_TIM_Base_MspInit结束/

  TIM1_HandleStructure.Instance = TIM1;   //选择TIM1
  TIM1_HandleStructure.Init.Period            = arr-1;
	//设置在下一个更新事件产生时,装入"自动重载入寄存器TIMx_ARR"的值
	//将(arr-1)写入"自动重载入寄存器TIMx_ARR",设置自动重装载值
  TIM1_HandleStructure.Init.Prescaler         = psc-1;
	//设置用来作为TIMx时钟频率除数的预分频值
	//将(psc-1)写入"预装载寄存器TIMx_PSC",的PSC[15:0],设置预分频值
	//计数器的时钟频率CK_CNT=fCK_PSC/(PSC[15:0]+1)
  TIM1_HandleStructure.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;//时钟不分频,则tDTS=tCK_INT
	//若使用HSE,计算公式:arr*psc/24000000/1,当arr=20000,psc=240时,则为200ms,误差为10us;
	//若使用HSI,计算公式:arr*psc/8000000/1,当arr=20000,psc=80时,则为200ms,误差为100us;
  TIM1_HandleStructure.Init.CounterMode       = TIM_COUNTERMODE_UP;//向上计数
  TIM1_HandleStructure.Init.RepetitionCounter = 1 - 1;
	//不重复计数
	//将(1-1)写入"重复计数寄存器TIMx_RCR"中的REP[7:0],设置"重复计数器值"
  TIM1_HandleStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	//"自动重装载寄存器"没有缓冲
	//不允许将"TIMx自动重新加载寄存器TIMx_ARR"的值被装入缓冲区;
	HAL_TIM_Base_Init(&TIM1_HandleStructure);    //TIM1初始化
	//选择计数器模式:向上计数
	//设置时钟分频因子:时钟不分频,则tDTS=tCK_INT
	//设置自动重装载:"自动重装载寄存器"没有缓冲
	//设置自动重装载值:TIM_Base_InitStructure.Period
	//设置预分频值:TIM_Base_InitStructure.Prescaler
	//设置"重复计数器值":TIM_Base_InitStructure.RepetitionCounter
  //启动更新事件:将TIMx_EGR中的UG位置1,由软件产生更新事件

	HAL_TIM_Base_Start_IT(&TIM1_HandleStructure);
  //允许计数器产生"更新中断";
  //如果计数器不是工作在触发模式中,则开始计数
}

void HAL_COMP_MspInit(COMP_HandleTypeDef *hcomp)
{
	GPIO_InitTypeDef GPIO_InitStructureure;

	if(hcomp->Instance == COMP1)
	{
    __HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟
    __HAL_RCC_COMP1_CLK_ENABLE();//使能COMP1时钟
    __HAL_RCC_COMP2_CLK_ENABLE();//使能COMP2时钟

    //PA1配置为模拟输入COMP1_INP2
    GPIO_InitStructureure.Pin = GPIO_PIN_1;             //选择第1脚
	  GPIO_InitStructureure.Pull = GPIO_PULLDOWN;         //引脚下拉被激活
	  GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_HIGH; //配置GPIO速度为高
    GPIO_InitStructureure.Mode = GPIO_MODE_ANALOG;      //设置引脚工作模式为模拟输入模式
    HAL_GPIO_Init(GPIOA,&GPIO_InitStructureure);
	  //根据GPIO_InitStructure结构变量指定的参数初始化GPIOA的外设寄存器

    //PA6映射到COMP1_OUT,配置为输出
    GPIO_InitStructureure.Pin = GPIO_PIN_6;             //选择第6脚
    GPIO_InitStructureure.Pull = GPIO_PULLDOWN;         //引脚下拉被激活
	  GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_HIGH; //配置GPIO速度为高
	  GPIO_InitStructureure.Mode = GPIO_MODE_AF_PP;       //复用功能推挽输出模式
    GPIO_InitStructureure.Alternate = GPIO_AF7_COMP1;   //选择AF7,将PA6复用为COM1_OUT
    HAL_GPIO_Init(GPIOA,  &GPIO_InitStructureure);            //初始化GPIO

    HAL_NVIC_EnableIRQ(ADC_COMP_IRQn);            //使能COMP中断
    HAL_NVIC_SetPriority(ADC_COMP_IRQn,0x01, 0);
	  //设置COMP1中断优先级为0x01,0无意义
  }
	if(hcomp->Instance == COMP2)
	{
	}
}

//函数功能:比较器1初始化
void Comparator_Init(void)
{
  hcomp1.Instance = COMP1;                                              //选择COM1
  hcomp1.Init.InputMinus      = COMP_INPUT_MINUS_VREFINT;               //比较器负输入端为VREF(1.2V)
  hcomp1.Init.InputPlus       = COMP_INPUT_PLUS_IO3;                    //比较器正输入端选择为PA1,pin PA1 for COMP1
  hcomp1.Init.OutputPol       = COMP_OUTPUTPOL_NONINVERTED;             //COMP1极性选择为不反向
  hcomp1.Init.Mode            = COMP_POWERMODE_HIGHSPEED;               //COMP1功耗模式选择为High speed模式
  hcomp1.Init.Hysteresis      = COMP_HYSTERESIS_DISABLE;                //迟滞功能关闭
  hcomp1.Init.WindowMode      = COMP_WINDOWMODE_DISABLE;                //WIODOW关闭
  hcomp1.Init.TriggerMode     = COMP_TRIGGERMODE_IT_RISING_FALLING;     //COMP1上升/下降沿触发
	HAL_COMP_Init(&hcomp1);//COMP1初始化

  HAL_COMP_Start(&hcomp1);  
}

void HAL_COMP_TriggerCallback(COMP_HandleTypeDef *hcomp)
{
	if(hcomp1.Instance == COMP1)
	{
		MCU_LED_Toggle();
	}
}

//函数功能:比较器1中断服务程序
void ADC_COMP_IRQHandler(void)
{
  HAL_COMP_IRQHandler(&hcomp1);
}

//函数功能:TIM1中断服务程序
//200ms中断一次
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
HAL_TIM_PeriodElapsedCallback开始/
  if (_HAL_TIM_GET_FLAG(TIM1,TIM_FLAG_UPDATE) != RESET)
  {//根据TIM_FLAG_UPDATE,读"TIMx状态寄存器(TIMx_SR)"中更新中断标志位
    _HAL_TIM_CLEAR_IT(TIM1, TIM_IT_UPDATE);
		//TIM_IT_UPDATE,令UIF=0,清除定时器更新中断标志位
    TIM1_LED_Toggle();
  }
HAL_TIM_PeriodElapsedCallback结束/
}
#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "delay.h"
#include "LED.h"
#include "SystemClock.h"
#include "Comparator.h"
//#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
//#include "string.h" //使能strcpy(),strlen(),memset()

const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";

int main(void)
{
	HSE_Config();
//	HAL_Init();//systick初始化
  delay_init();
	HAL_Delay(1000);

//	USART2_Init(115200);
//PA0是为USART2_TX,PA1是USART2_RX
//中断优先级为0x01
//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
//	printf("%s",CPU_Reset_REG);

	MCU_LED_Init();
	TIM1_LED_Init();
	TIM1_COUNTERMODE_UP_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;
	Comparator_Init();

  while (1)
  {
		delay_ms(100);
//		MCU_LED_Toggle();

  }
}

注意:普冉单片机PY32F003F18,国产ARM芯片,在使用模拟量时,一定要注意CPU的“IO输入电压”要小于等于“CPU电源电压”,否则,会导致AD转换错误。切记踩坑啊!!!

更多推荐

docker总结

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题1.1.1.应用部署的环境问题大型项目组件较多

CLR via C#(三)垃圾回收

一、资源生命周期每个程序运行都需要各种资源,如文件、内存缓冲区、数据库等。要使用这些资源,就必须为代表资源的类型分配内存。访问一个资源所需的步骤如下:调用IL指令newobj,为代表资源的类型分配内存(在C#中一般用new操作符完成)初始化内存,设置资源的初始状态并使资源可用访问类型成员来使用资源摧毁资源状态以进行清理

多线程的学习第二篇

多线程线程是为了解决并发编程引入的机制.线程相比于进程来说,更轻量~~更轻量的体现:创建线程比创建进程,开销更小销毁线程比销毁进程,开销更小调度线程比调度进程,开销更小进程是包含线程的.同一个进程里的若干线程之间,共享着内存资源和文件描述符表每个线程被独立调度执行.每个线程都有自己的状态/优先级/上下文/记账信息进程是

Apache Tomcat

简介简而言之,Tomcat是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器。ApacheTomcatTomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支

Responder

环境准备操作系统:KaliLinux工具:responder,john,evil-winrmPS:输入以下命令解决靶场环境无法打开问题#echo"<靶机IP>unika.htb">>/etc/hostsresponder工具[Kali官网]手册地址:https://www.kali.org/tools/responde

NSS [HNCTF 2022 WEEK2]easy_sql

NSS[HNCTF2022WEEK2]easy_sql这题考察了无列名注入,首先了解一下什么是无列名注入再开始做题吧。为什么会需要无列名注入?我们常用的SQL注入方法是通过information_schema这个默认数据库来实现,可是你有没有想过,如果过滤了该数据库那么我们就不能通过这个库来查出表名和列名。不过我们可以

UWB定位模块

UWB定位模组是华星智控自研的小尺寸高集成度模组,模组长宽厚为30.1513.955.62毫米,天线采用IPEX接口分体式设计,方便集成于您的产品中,产品采用本安设计,可以用于煤矿等井下场景,通信距离>100米,供电电压3.7V,支持标准锂电池供电。该模块定位精度可到10~30厘米,适合集成在各种需要高精度测距和定位产

可转债长期持有策略——收益与风险、利息收入、案例研究

可转债投资策略——长期持有策略一、收益与风险的权衡长期持有可转债是一种投资策略,旨在实现稳定的收益,并在投资期限内从可转债中获得利益。在采用这种策略时,投资者需要平衡可转债的收益和风险,以满足其财务目标。以下是关于长期持有策略中的收益与风险的权衡:收益:长期持有可转债可以提供稳定的利息收入,这对于寻求规模较大的收入的投

Mybatis 映射器中使用@InsertProvider,@UpdateProvider,@DeleteProvider,@SelectProvider

上一篇我们介绍了在Mybatis映射器的映射方法中使用@Param接收多个参数;本篇我们继续介绍如何在Mybatis的映射器中使用动态SQL。如果您对Mybatis映射器的映射方法中使用@Param接收多个参数不太了解,建议您先进行了解后再阅读本篇,可以参考:Mybatis映射器中映射方法接受多个参数(@Param)h

【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

Skywalkingskywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的分布式系统一、Skywalking介绍1.什么是SkyWalkingSkywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin/Pinpoint/CAT的设计思路。特点是:支持多种

Meta-Transformer:基于Transformer的多模态感知,融合Token化与共享编码

论文标题:Meta-Transformer:AUnifiedFrameworkforMultimodalLearning论文地址:https://arxiv.org/pdf/2307.10802.pdf这里写目录标题引言基于Transformer的多模态发展Meta-Transformer框架预备知识数据到序列如何分词

热文推荐