历史上的今天
今天是:2024年12月29日(星期日)
2018年12月29日 | stm32学习笔记(十二)ADC实验
2018-12-29 来源:eefocus
#include "adc.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK miniSTM32开发板
//ADC 代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/7
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t { temp_val+=Get_Adc(ch); delay_ms(5); } return temp_val/times; }
史海拾趣
|
多层PCB加工过程中必不可少的就是使用到压合机,而压合机压力的均匀性和温度的均匀性对压合的品质影响相当之大,而如何通过试验的方式进行定期的检测其稳定性,从而保证产品的压合品质呢。论坛里有就这个问题进行的相关讨论,现在其中的讨论结果综 ...… 查看全部问答> |
|
在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。很多年前,一位开发人员为了在对嵌入式有更深层次的理解,向Ora ...… 查看全部问答> |
|
3路并行40M的LVDS信号想通过一根光纤传输,到另一端然后再还原成3路并行LVDS信号,首先肯定是先将3路信号转化成串行数据,然后再发送到接收端,接收端再把串行数据还原成并行数据。光纤传输有现成的模块,逻辑部分想用FPGA做,现在发现若对40M的信 ...… 查看全部问答> |
|
死活不成功,用的是micro SDHC 参考SD2.0标准,但循环接受ACMDD41就会一直不停的接受到0x01 不知怎么回事 希望高手解答呵呵 void SDCardInit( void ) { u8 ret = 0 ; ...… 查看全部问答> |
|
我用PB成功编译通过,但是下载到开发版上面却无法正常开机提示如下: VBridge is not initialized! Bail out.. +CS8900:DriverEntry InitEthDevice Port ok. Product ID = a00 InitEthDevice Port ok. [HSMMC0] Initializing the ...… 查看全部问答> |
|
创建新线程后,在调试跟踪的时候,新线程中对传入参数(一个控件)实施操作的时候报错 点击一个按钮后,创建一个线程,传入一个参数(一个控件,比如是CComboBox),在新线程里对该控件实施操作的时候,系统提示说MFCCE300.DLL错误,语句定到ASSERT一行,说SENDMESSAGE的时候有错误,如果是跟踪调试的话,线程变量显示的那个小窗体的标题就灰了不 ...… 查看全部问答> |
|
不知道如何了解:USB函数中各个CallBack究竟做了什么事? USB_Lib程序中,出现五六个回调函数,不知道它们究竟做了. 比方SOF_Callback, 顾名思义理解为产生帧头,但到底这样理解对不对,心中没有数? 何况,除了SOF_Callback外,还有一些XXX_Callback函数本身名称也不太清楚的,更不容易理解了. … 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:42 编辑 各有关高校: 为了更好的支持2011年全国大学生电子设计竞赛,TI与E络盟公司(前身即为派睿电子,一家专注于小批量销售的英国公司)合作,推出了今年的小批量特价销售计划:即经TI授权的学校,能够以 ...… 查看全部问答> |
|
最近在学习Stellaris系列MCU的USB模块,做了点笔记,论坛上关于USB这一块的分析很少,虽然是菜鸟但还是发上来,供大家批判!哈哈。 共同学习共同进步啊!! 简介 ...… 查看全部问答> |




