长沙企业网站建设较好的公司电商网站开发
news/
2025/9/24 1:35:35/
文章来源:
长沙企业网站建设较好的公司,电商网站开发,微信电脑网站是什么原因,重庆seo教程博客原标题#xff1a;STM32之ADC步骤小技巧#xff08;英文#xff09; 看到标题#xff0c;别吓到哈、并不是要用英文写、至于原因是什么、请往下看#xff1a; 言归正传#xff1a;STM32的ADC模块的特色 1、1MHz转换速率、12位转换结果#xff08;12位、记住这个12位哈、…原标题STM32之ADC步骤小技巧英文 看到标题别吓到哈、并不是要用英文写、至于原因是什么、请往下看 言归正传STM32的ADC模块的特色 1、1MHz转换速率、12位转换结果12位、记住这个12位哈、因为2^124096 也请记住4096哈 STM32F103系列在56MHz时转换时间为1μs 在72MHz时转换时间为1.17μs 2、转换范围03.6V 3.6v----当你需要将采集的数据用电压来显示的话设你采集的数据为x[0~4095],此时的计算公式就为(x / 4096) * 3.6 3、ADC供电要求2.4V3.6 V可千万别接到 5V 的石榴裙子底下呀 4、ADC输入范围VREF-≤ VIN ≤VREF (VREF和VREF-只有LQFP100封装才有) 5、双重模式(带2个ADC的设备): 8种转换模式 6、最多有18个通道16个外部通道 2个内部通道连接到温度传感器和内部参考电压(VREFINT 1.2V) ...... 12、DMA功能(仅ADC1有) 本博客里由于篇幅、所以就以独立模式下的单次转换为例哈、打开参考手册可以看到这段话 单次转换模式下ADC只执行一次转换。 该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道)这时CONT位为0。 一旦选择通道的转换完成 ● 如果一个规则通道被转换 ─ 转换数据被储存在16位ADC_DR寄存器中 ─ EOC(转换结束)标志被设置 ─ 如果设置了EOCIE则产生中断。 ● 如果一个注入通道被转换 ─ 转换数据被储存在16位的ADC_DRJ1寄存器中 ─ JEOC(注入转换结束)标志被设置 ─ 如果设置了JEOCIE位则产生中断。 然后ADC停止。 对于以上的寄存器 1、ADC状态寄存器(ADC_SR) 2、ADC控制寄存器1(ADC_CR1) 3、ADC控制寄存器2(ADC_CR2) EXTSEL[2:0]选择启动规则通道组转换的外部事件 (External event select for regular group) ALIGN数据对齐 (Data alignment) RSTCAL复位校准 (Reset calibration) CALA/D校准 (A/D Calibration) CONT连续转换 (Continuous conversion) ADON开/关A/D转换器 (A/D converter ON / OFF) 4、ADC采样时间寄存器1(ADC_SMPR1) SMPx[2:0]选择通道x的采样时间 (Channel x Sample time selection) 5、ADC规则序列寄存器1(ADC_SQR1) L[3:0]规则通道序列长度 (Regular channel sequence length) SQ1[4:0]规则序列中的第1个转换 (1st conversion in regular sequence)ADC规则序列寄存器3(ADC_SQR3) 6、ADC规则数据寄存器(ADC_DR) DATA[15:0]规则转换的数据 (Regular data) 由于寄存器过于多我们就不在这一一列举了哈、、因为我主要是用库所以寄存器相关的位都不具体介绍了哈、请大家参照中文手册 在这里向大家介绍下数据对齐 ALIGN位用于设置对齐方式右或左 对于注入通道转换结果是减去偏移量的值可以为一个负数在右对齐时扩展位为符号位。 那我们现在要怎么来实现呢这个问题、相信大家在看了那么多的寄存器之后急迫想要知道的吧、、前面的只是个热身、、接下来步骤如下 1、开启ADC1的时钟由于ADC1是在PA1上所以同时也要打开PA的时钟并进行相关的配置、对于这个配置要把PA1设置成模拟输入为什么呢大家打开中文参考手册可以看到 啊哈、、这下子清楚了吧、 2、复位ADC1设置ADC1的分频因子记住这里的ADC的时钟不能超过14MHZ而且其采样周期长点会好点 ADCCLK---最快可达14MHz, 时钟来自经过分频器的PCLK2(2、4、6、8分频) 整个转换时间 采样时间 12.5个周期固定时间 在14MHz和采样时间位1.5周期时 转换时间1μs (14个周期 cycles) 当ADCCLK14MHz和1.5周期的采样时间 TCONV 1.5 12.5 14周期 14×(1 / (14 × 1000000)) 1μs 其采样周期一览表 涉及到采样周期、这里来看看转换序列 最多达16个转换通道且可以采样不同的顺序排列不同的采样时间和过采样的可能性。 例如- 转换通道1、2、8、4、7、3、11 - 不同的采样时间 - Oversampling of channel 7。 3、初始化ADC1的参数、设置ADC1的工作模式和规则序列的相关信息 大家通过打开stm32f10.adc.h可以看到 1 typedef struct
2 {
3 uint32_t ADC_Mode; //设置ADC模式--独立模式
4 FunctionalState ADC_ScanConvMode; //设置是否开启扫描模式 ---否
5 FunctionalState ADC_ContinuousConvMode; //设置是否开启连续转换模式 ----否
6 uint32_t ADC_ExternalTrigConv; //设置启动规则转换组转换模式----软件触发
7 uint32_t ADC_DataAlign; //设置数据对齐方式-----右对齐
8 uint8_t ADC_NbrOfChannel; //设置规则序列的长度----顺序进行规则转换的ADC通道数目1
9 }ADC_InitTypeDef; 4、使能ADC并校准 注在设置完了以上信息后使能AD转换器执行复位校准和AD校准这两步校准一定要否则数据将不准 还有记住每次进行校准之后都要等待校准结束但是通过什么方式知道校准结束呢 这里是通过获取校准状态来判断是否校准结束相关的库函数请看代码 分别的库函数请看待会的代码。请用比较老外的方式去看也就是用英语啦为什么呢请看下文 5、读取AD的值 当然这里说读取AD值并不是那么的简单以上我们只是准备好了AD还没有设置相关的规则序列通道采样顺序以及采样周期设置完之后启动AD转换就行了、然后才直接读取哈、、 相关的库函数请看代码 1 void Adc_Init(void)2 {3 4 ADC_InitTypeDef ADC_InitStructure;5 GPIO_InitTypeDef GPIO_InitStructure;6 7 /* Enable ADC1 and GPIOA clock */8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);9
10 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ
11
12 /* Configure PA.1 (ADC Channel) as analog input -------------------------*/
13 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1;
14 GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN;
15 GPIO_Init(GPIOA, GPIO_InitStructure);
16
17 //ADC_DeInit(ADC1);//在这里复位被我注释掉了、至于为什么我待会会说
18
19 /* ADC1 configuration ------------------------------------------------------*/
20 ADC_InitStructure.ADC_Mode ADC_Mode_Independent;//这里对应上面所讲的配置在这里就不给出注释了
21 ADC_InitStructure.ADC_ScanConvMode DISABLE;
22 ADC_InitStructure.ADC_ContinuousConvMode DISABLE;
23 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None;
24 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right;
25 ADC_InitStructure.ADC_NbrOfChannel 1;
26 ADC_Init(ADC1, ADC_InitStructure);
27
28 /* Enable ADC1 *///知道我为啥要在上面提醒大家要用老外的方式来看了吧、因为这里的注释都是用英文的
29 //请不要以为我装逼我这样做是有原因的、、原因我待会会说、你也会明白我最初的标题为何那样写
30
31 ADC_Cmd(ADC1, ENABLE);
32
33 /* Enable ADC1 reset calibration register */
34 ADC_ResetCalibration(ADC1);
35 /* Check the end of ADC1 reset calibration register */
36 while(ADC_GetResetCalibrationStatus(ADC1));
37
38 /* Start ADC1 calibration */
39 ADC_StartCalibration(ADC1);
40 /* Check the end of ADC1 calibration */
41 while(ADC_GetCalibrationStatus(ADC1));
42 } 1 u16 Get_val(u8 ch)2 {3 u16 DataValue; //又是英文注释、、啊哈 4 /* ADC1 regular channel14 configuration */ 5 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);6 7 /* Start ADC1 Software Conversion */ 8 ADC_SoftwareStartConvCmd(ADC1, ENABLE);9
10 /* Test if the ADC1 EOC flag is set or not */
11
12 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
13 //FlagStatus Status;
14 //Status ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
15 //while(!Status);----这样做实现不了、请注意
16 /*Returns the ADC1 Master data value of the last converted channel*/
17 DataValue ADC_GetConversionValue(ADC1);
18 return DataValue;
19 }
20
21 u16 ADC_Get_aveg(u8 ch,u8 n)
22 {
23 u32 ad_sum 0;
24 u8 i;
25 for(i0;in;i)
26 {
27 ad_sum Get_val(ch);
28 delay_ms(5);
29 }
30 return (ad_sum / n);
31 }
32
33 adcxADC_Get_aveg(ADC_Channel_1,10);//获取AD数值0~4095
34
35 temp(float)adcx*(3.3/4096);//获取相应的电压值 到了这一步我们已经完成了AD采集数据的任务、接下来有人可能有时候会觉得很纳闷为什么有些人知道要完成特定的功能它的步骤是怎么样的、为什么我就不知道这个问题嘛、、接下来我讲的希望能稍微帮你也希望你能好好的借鉴、 步骤小技巧其实也没啥的、大家知道下载库的文件的时候里面都有包含每个模块的例子和一个模版、拿ADC这个模块来举例 点击main.c可以看到神奇的一幕 大家仔细看看可以发现在官方给的历程中的步骤里并没有复位ADC的函数个人觉得所以没有必要去复位当然复位也不是什么坏事哈、看你个人、、看到这、应该明白了我前面的说法了吧、还有、大家应该也注意到了、都是英文的注释、、所以看到这大家也清楚了前面不是我装逼、、所以呢、其实英语对于我们来说还是很重要的、、那有人问时钟的分频因子呢怎么没有设置不急哈、、请看 对于分频因子的设置也在这个函数里而这个RCC_Configuration在最开始已经使用 了、、 所以大家要好好利用官方给的历程。 转载于:https://www.cnblogs.com/zwdly/p/8193044.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914495.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!