STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

2024-01-10

一、前言

最近在学习STM32的ADC功能,遇到了一个奇怪的问题。
使用芯片:STM32F407ZGT6
使用函数:库函数
使用代码:正点原子的例程《实验16 ADC实验》
串口工具:VOFA

二、问题1:数值超过4096

博主直接使用了正点原子的程序,如下面所示,使用的 12位的ADC1,端口是PA5

//初始化ADC															   
void  Adc_Init(void)
{    
  GPIO_InitTypeDef  GPIO_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_InitTypeDef       ADC_InitStructure;
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

  //先初始化ADC1通道5 IO口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
 
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);	  //ADC1复位
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,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_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz 
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
	
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式	
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐	
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
  ADC_Cmd(ADC1, ENABLE);//开启AD转换器	
}

为了容易查看数值,博主将adc.h和adc.c移植到了串口打印的程序之中,这样子可以在电脑的串口工具查看相对于的数值。
主函数的代码如下,将ADC采集到的原始数值和转化为电压之后的数值用串口打印出来

adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
temp=(float)adcx*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
printf("%d,%f\n",adcx,temp);

从下面的结果可以看出超过我们的12位ADC的最大值4096(2^12=4096)。

在这里插入图片描述

三、问题1的排错过程

首先,博主将ADC检测引脚接到3.3V,出现了下面的状况:ADC采集到的数值很大,接近于65535,也就是2^16。

在这里插入图片描述
这让博主想到应该是ADC设置模型的时候设置为左对齐模型,查看了代码(如下)后发现设置的是 右对齐模式

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐

根据《STM32F407参考手册》P255可以得到下面结论:

  • 右对齐:将采集到的数据放在低12位
  • 左对齐:将采集到的数据放在高12位

在这里插入图片描述

为了验证是否真的是左对齐,博主先假设其位左对齐,根据上面的知识可以知道,想要实现右对齐,只需要将采集到的数值 向右移动四位 即可,因此,博主将主函数改为如下的代码:

adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
adcx = adcx >> 4;
temp=(float)adcx*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
printf("%d,%f\n",adcx,temp);

结果如下图所示,左边是浮空状态下的数值,右边是将ADC检测引脚接到3.3V的数值,可以看出结果小于4096。

在这里插入图片描述
综上可得: 虽然代码设置了右对齐,但是实际上是左对齐。

四、问题2:右对齐模式设置失败

为了探究对齐模式设置失败的问题,博主先学习了ADC的寄存器,在《STM32F407参考手册》P276里面找到对齐模式的设置存在于 寄存器ADC_CR2里面的第11位 ,名称是 ALIGN
在这里插入图片描述
在这里插入图片描述

打开Keil的调试模式,查看到代码运行过ADC的初始化ADC_Init(ADC1, &ADC_InitStructure)之后, 低11位的ALIGN居然是打勾的,也就是1,代表就是 左对齐!!!

在这里插入图片描述

为了进一步研究问题所在,博主进入函数ADC_Init(),查看到给CR2(就是前面学习到设置对齐模式的寄存器)赋值的是 tmpreg1 ,可以看到tmpreg1和四个值进行了 或操作 ,根据之前的博客 《STM32需要的基本知识——位运算》 可知,如果这四个值的第11位是1的话,那么或操作之后整个CR2的第11位就是1。

  tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | \
                        ADC_InitStruct->ADC_ExternalTrigConv | 
                        ADC_InitStruct->ADC_ExternalTrigConvEdge | \
                        ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1));
                        
  /* Write to ADCx CR2 */
  ADCx->CR2 = tmpreg1;

接下来便进一步调试查看这四个值的数值,查看对应的二进制:

  • ADC_DataAlign:0x00000000
  • ADC_ExternalTrigConv: 0x0501BD00
  • ADC_ExternalTrigConvEdge :0x00000000
  • ADC_ContinuousConvMode:0x00

在这里插入图片描述
ADC_ContinuousConvMode << 1 = 0x00 << 1 = 0x00
ADC_ExternalTrigConv:0x0501BD00= 0101 0001 0000 1011 1 101 0000 0000
可以看到第11位是1,那么根据上面的结论可以知道tmpreg1的第11位也是1,即整个CR2的第11位就是1。
也就是说是因为ADC_ExternalTrigConv导致我们设置的对齐模式位左对齐。
进一步回顾正点原子的ADC初始化代码(如下)可以发现,确实没有对这一项进行初始化。
至于为什么他没有初始化,这个博主就不得而知了。

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz 
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
	
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式	
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐	
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化

综上可得: 右对齐模式设置失败的原因是没对ADC_InitStructure.ADC_ExternalTrigConv进行初始化设置。

五、问题2的解决方法

知道了问题所在,博主目前研究两种解决方法:
第一种:将ADC_ExternalTrigConv设置为0;
第二种:使用ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);初始化ADC_ExternalTrigConv;

5.1 将ADC_ExternalTrigConv设置为0

既然是ADC_ExternalTrigConv不为零导致的,那直接将其设置为0,即添加代码

  ADC_InitStructure.ADC_ExternalTrigConv = 0;//添加这一行

ADC的完整代码如下:

//初始化ADC															   
void  Adc_Init(void)
{    
  GPIO_InitTypeDef  GPIO_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_InitTypeDef       ADC_InitStructure;
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

  //先初始化ADC1通道5 IO口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
 
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);	  //ADC1复位
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,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_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz 
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
	
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式	
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐	
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 
  //====================================================//
  ADC_InitStructure.ADC_ExternalTrigConv = 0;//添加这一行
  //====================================================//
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
  ADC_Cmd(ADC1, ENABLE);//开启AD转换器	
}

5.2 使用ADC_StructInit()函数

从上面的代码可以看出 ADC_ExternalTrigConv 是结构 ADC_InitTypeDef 的一个成员,那看看有没有官方自带的初始化函数。

ADC_InitTypeDef       ADC_InitStructure;
ADC_InitStructure.ADC_ExternalTrigConv = 0

stm32f4xx_adc.h 里面看到有对结构体进行初始化的函数,且有对 ADC_InitTypeDef 进行初始化的。

/* Initialization and Configuration functions *********************************/
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
void ADC_CommonStructInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

stm32f4xx_adc.c 进一步研究该函数的代码:

/**
  * @brief  Fills each ADC_InitStruct member with its default value.
  * @note   This function is used to initialize the global features of the ADC ( 
  *         Resolution and Data Alignment), however, the rest of the configuration
  *         parameters are specific to the regular channels group (scan mode 
  *         activation, continuous mode activation, External trigger source and 
  *         edge, number of conversion in the regular channels group sequencer).  
  * @param  ADC_InitStruct: pointer to an ADC_InitTypeDef structure which will 
  *         be initialized.
  * @retval None
  */
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct)
{
  /* Initialize the ADC_Mode member */
  ADC_InitStruct->ADC_Resolution = ADC_Resolution_12b;

  /* initialize the ADC_ScanConvMode member */
  ADC_InitStruct->ADC_ScanConvMode = DISABLE;

  /* Initialize the ADC_ContinuousConvMode member */
  ADC_InitStruct->ADC_ContinuousConvMode = DISABLE;

  /* Initialize the ADC_ExternalTrigConvEdge member */
  ADC_InitStruct->ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

  /* Initialize the ADC_ExternalTrigConv member */
  ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

  /* Initialize the ADC_DataAlign member */
  ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right;

  /* Initialize the ADC_NbrOfConversion member */
  ADC_InitStruct->ADC_NbrOfConversion = 1;
}

其中的 ADC_ExternalTrigConv_T1_CC1 确实设置的是0。

#define ADC_ExternalTrigConv_T1_CC1                ((uint32_t)0x00000000)
#define ADC_ExternalTrigConv_T1_CC2                ((uint32_t)0x01000000)
#define ADC_ExternalTrigConv_T1_CC3                ((uint32_t)0x02000000)
#define ADC_ExternalTrigConv_T2_CC2                ((uint32_t)0x03000000)
#define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x04000000)
#define ADC_ExternalTrigConv_T2_CC4                ((uint32_t)0x05000000)
#define ADC_ExternalTrigConv_T2_TRGO               ((uint32_t)0x06000000)
#define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x07000000)
#define ADC_ExternalTrigConv_T3_TRGO               ((uint32_t)0x08000000)
#define ADC_ExternalTrigConv_T4_CC4                ((uint32_t)0x09000000)
#define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x0A000000)
#define ADC_ExternalTrigConv_T5_CC2                ((uint32_t)0x0B000000)
#define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x0C000000)
#define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x0D000000)
#define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x0E000000)
#define ADC_ExternalTrigConv_Ext_IT11              ((uint32_t)0x0F000000)

所以加一行对结构体的初始化即可:

ADC_StructInit(&ADC_InitStructure);

完整代码如下:

//初始化ADC															   
void  Adc_Init(void)
{    
  GPIO_InitTypeDef  GPIO_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_InitTypeDef       ADC_InitStructure;
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

  //先初始化ADC1通道5 IO口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
   
  ADC_DeInit();//ADC复位
 
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz 
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
	
  ADC_StructInit(&ADC_InitStructure);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式	
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐	
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
  
  ADC_Cmd(ADC1, ENABLE);//开启AD转换器	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败 的相关文章

  • 在python中将字典转换为二进制

    我有一本字典 其中键作为我的客户 ID 值作为我的电影 ID 尽管客户已经多次观看同一部电影 但我希望将其制作为一部电影 这里我需要将我的字典转换为二进制数据 在所有行中 我需要客户 ID 和列作为电影 ID 如果客户看过电影 则给出 1
  • 如何删除默认的 Bootstrap 3 轮播控件背景渐变?

    我很确定这是我需要修改的代码 但由于某种原因我无法让渐变在 IE 中消失 我要他们彻底消失 carousel control text shadow none opacity 1 filter alpha opacity 100 carou
  • Pandas Groupby Agg 功能不减少

    我正在使用我在工作中已经使用了很长时间的聚合函数 这个想法是 如果传递给函数的系列的长度为 1 即该组只有一个观察值 则返回该观察值 如果传递的系列的长度大于 1 则观察结果将以列表形式返回 这对某些人来说可能看起来很奇怪 但这不是一个 X

随机推荐

  • (Tomcat) 部署时备份 WAR

    是否有任何内置机制可以在 Tomcat 中部署时备份 war 文件 例如 我部署了 whosit war 我想要当前部署的 whosit war 备份到 whosit backup war 或者 如果每个部署在 whosit deploy
  • 计算一个字符串在另一个字符串中出现的次数

    我有一个指向 CSS 文件的字符串 css style css 我想知道有多少 都在字符串之内 我如何用 JavaScript 得到这个 对于这个简单的情况 您不需要正则表达式 var haystack css style css var
  • 如何根据给定的文件夹名称创建多个目录

    我有一个文件列表 这些文件的名称由类组和 ID 组成 eg science 000000001 java 我能够获取所有文件的名称并将它们拆分 因此我将类组放入一个数组中 将 id 放入另一个数组中 我拥有它 以便数组不能有两个相同的值 这
  • 使用带有remote: true 的ajax 的Ruby 表单会给出ActionController::InvalidAuthenticityToken 错误。经典提交不

    我正在为 RoR 网站编写聊天页面 我已经用 HTML 解决了所有问题 并且正在尝试使用 ajax 来实现它 有一个用于提交消息的表格 表单标签读取 我的整个看法 br div align center br span span div
  • Oracle 替换功能

    我需要在选择查询时从表 2 的值中替换表 1 的字段值 Eg Table1 Org Permission Company1 1 3 7 Company2 1 3 8 Table2 Permission Permission 1 Read 3
  • Swiper spaceBetween 无法正常工作

    我正在尝试使用slidesPerView auto with spaceBetween 20财产 但是Swiper https idangero us swiper api 每个视图仅显示一张幻灯片 我想在第一张幻灯片之后显示下一张幻灯片
  • 使用 X,Y 坐标绘制圆内的点

    javascript中有没有一种方法可以绘制x y坐标 使它们落入圆形而不是方形 例如 如果我有以下代码 circleRadius 100 context drawImage img elem dx dy dw dh 我需要计算出落在 10
  • 不安全的指针迭代和位图 - 为什么 UInt64 更快?

    我一直在做一些不安全的位图操作 并发现减少指针的增加次数可以带来一些重大的性能改进 我不确定为什么会这样 即使您在循环中进行了更多的按位运算 但最好还是在指针上进行更少的迭代 例如 不要使用 UInt32 迭代 32 位像素 而是使用 UI
  • Web服务使用kso​​ap方法从应用程序接收空参数

    我见过讨论这个问题的主题 但似乎没有人发布解决方案 目前 我正在测试将参数传递给我的 Net Web 服务 当参数到达 Web 服务时 它会添加一个附加字符串 然后将其返回到我的应用程序 但我返回的只是字符串消息 而不是我传递的参数 我的网
  • 如何在 jasper (iReport) 报告上显示阿拉伯语、希伯来语等语言字体

    我有这个简单的表格报告 其中包含许多不同类型的列 但是当打印报告时rtf 字 扩大 带有数字或日期的列appears on the report 包含阿拉伯语内容的栏目appear on the report 但是当打印报告时PDF扩大 带
  • 如何更改 .NET MAUI 中 TabBar 的选项卡标题字体

    在我的 AppShell xaml 中 我有以下 TabBar 代码 我似乎找不到允许我更改标题字体 和字体大小等 的属性或任何内容
  • 如何签出旧提交并将其设为新提交

    我想 跟进 关于此事的另一个问题 签出旧提交并将其设为新提交 https stackoverflow com questions 3380805 checkout old commit and make it a new commit 但他
  • 如何删除用jquery创建的元素?

    我在 jquery 中编写了这段代码 以在一些事件发生后创建三个元素 body append tmp div div div div appendTo tmp div div appendTo tmp 这三个元素是正常创建的并添加到我的 D
  • Javascript - 表单选择元素在新窗口中打开 url 并提交表单

    UPDATED 请阅读原始问题下面的更多详细信息 我有一个带有各种 url 的选择表单元素 我想在选择时在新窗口中打开 为此 我在元素的 onchange 事件中添加了以下代码 window open this options this s
  • 将链接/模板列添加到自定义表格组件

    我有一个基于本文构建的表格组件 从头开始创建 Angular2 数据表 http 4dev tech 2016 09 creating an angular2 datatable from scratch 我一直在扩展它 所以做我的应用程序
  • 如何为小部件添加轮廓边框?

    如何在 wxpython 中向小部件添加轮廓边框 任何小部件 例如wx Button 对于面板 您可以使用 p wx Panel style wx SUNKEN BORDER 在那里你可以选择常量 wx SIMPLE BORDER wx R
  • 如何找到时间序列的顶部和底部?

    乍一看 这个问题听起来确实很愚蠢 但它并不是根本性的 也许 它看起来似乎无法通过任何算法完全解决 但我假装说它是 所以提问 我有图表 例如黄金 我需要找到时间轴上的顶部和底部在哪里 问题是我需要找到主要的好转和主要的衰退从哪里开始 问题是存
  • TranslateTransform 用于 Silverlight 中的拖放

    我们正在尝试在 Silverlight 3 中实现拖放 我们希望用户能够将元素从树视图拖动到 UI 的另一部分 父元素是 Grid 我们一直在尝试将 TranslateTransform 与 MouseLeftButtonDown Mous
  • 闵氏距离在文本检索中的应用

    1 背景介绍 文本检索是现代信息处理系统中不可或缺的一部分 它的主要目标是根据用户的查询需求 从海量的文本数据中找出与查询最相关的文档 随着互联网的普及 文本数据的规模不断膨胀 这导致了传统的文本检索方法面临着巨大的挑战 为了解决这些问题
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前