当前位置: 首页 > wzjs >正文

小程序推广网站个人网站开发要多久

小程序推广网站,个人网站开发要多久,免费wordpress博客主题,免费的个人主页网页制作网站目录 一、CubeMX配置ADC 1.1ADC的知识点(很重要) ⭐⭐CubeMX配置ADC须知(ADC必知知识点) ​编辑 1.2ADC单次非扫描 1.3ADC连续非扫描 1.4单次/连续非扫描总结 1.5扫描连续模式多通道(非DMA) 1.6扫描非连续模式多通道&#…

目录

 

一、CubeMX配置ADC

1.1ADC的知识点(很重要)

⭐⭐CubeMX配置ADC须知(ADC必知知识点)

​编辑

 

1.2ADC单次非扫描

1.3ADC连续非扫描

1.4单次/连续非扫描总结

1.5扫描连续模式多通道(非DMA)

1.6扫描非连续模式多通道(DMA)

1.7扫描连续模式多通道(DMA)

1.8定时器通道输出(TRGO)触发ADC

1.9其他更多触发方式


 

一、CubeMX配置ADC

1.1ADC的知识点(很重要)

转换模式:

扫描模式

关闭扫描模式:只转换ADC_SQRx或ADC_JSQR选中的第一个通道

打开扫描模式:扫描所有被ADC_SQRx或ADC_JSQR选中的所有通道

单次转换/连续转换

单次转换:只转换一次

连续转换:转换一次之后,立马进行下一次转换

更详细说明(务必要看懂)

1 单次转换模式:ADC只执行一次转换;

2 连续转换模式:转换结束之后马上开始新的转换;

3 扫描模式:ADC扫描被规则通道和注入通道选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续 转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

4 间断模式:触发一次,转换一个通道,在触发,在转换。在所选转换通道循环,由触发信号启动新一轮的转换,直到转换完成为止。

 

 

     扫描模式简单的说是一次对所有所选中的通道进行转换,比如开了ch0,ch1,ch4,ch5。  ch0转换完以后就会自动转换通道1,4,5直到转换完这个过程不能被打断。如果开启了连续转换模式,则会在转换完ch5之后开始新一轮的转换。

 

     这就引入了间断模式,可以说是对扫描模式的一种补充。它可以把0,1,4,5这四个通道进行分组。可以分成0,1一组,4,5一组。也可以每个通道单独配置为一组。这样每一组转换之前都需要先触发一次。

⭐⭐CubeMX配置ADC须知(ADC必知知识点)

配置ADC工作模式属性:

规则通道设置:

设置ADC触发方式:

Regular Conversion launched by software 规则的软件触发 调用函数触发即可

Timer X Capture Compare X event 外部引脚触发,

Timer X Trigger Out event 定时器通道输出触发 需要设置相应的定时器设置

rank转换顺序、Sampling Time(转换周期:默认1.5):

注入通道设置:

硬件内部:

两者的区别就是:

规则通道就相当于一个客人可以一次性点16个菜(开启16个通道),但是出餐的时候只能每次端上一个菜(得到一个转换结果数据),一次性端太多的话就会覆盖前面的(规则通道数据寄存器只有16位),所以最好配合DMA一起工作!DMA会转移数据到其他地方,避免覆盖!

注入通道就相当于一个客人可以一次性点4个菜(开启4个通道),并出餐的时候每次可以端上四个菜(得到四个转换结果数据),(规则通道数据寄存器只有4x16位)!

ADC转换中断:

ADC的DMA传输:

byte:字节,通用8位,与u8相同

word:字长,与硬件的位数相同,STM32是32位,所以对应是u32

Half Word:半个字长,所以对应是u16

 

1.2ADC单次非扫描

 

单次/连续:转换后是否继续自动转换,单次就不继续自动转换

扫描/非扫描:是否支持多通道,扫描就可以多通道

可知,单次非扫描就是给指令就开始转换,转换需要等待完成,转换完成后需要再次给指令才能继 续转换。且一次只能转换一个通道。

1、配置ADC参数:

1. 选择通道

2. 选择为独立模式:对应标准库中的 ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;

3. 设置数据为右对齐、非扫描模式、非连续模式。

4. 转换通道数为1,因为前面只勾选上了IN0

代码实现:

编写单次转换函数:

HAL_StatusTypeDef HalState;//转换完成效果
uint16_t Ret;//转换完成的数据uint16_t StartAndGetOneResult()
{HAL_ADC_Start(&hadc1);//开始转换(软件触发)HalState= HAL_ADC_PollForConversion(&hadc1, 10);//第二个参数是等待超时时间if(HalState == HAL_OK)//转换成功{Ret=HAL_ADC_GetValue(&hadc1);} else{Ret=0;}//HAL_ADC_Stop(&hadc1);//停止转换return Ret;//返回转换数据
}

main函数:

HAL_ADCEx_Calibration_Start(&hadc1);//校准ADC
其他的就是自己想要转换什么的ADC和显示数据了!

1.3ADC连续非扫描

1. 把连续模式打开

 

方便之处:只需要执行一次开始转换即可,也不需要等待转换完成

main函数:

HAL_StatusTypeDef HalState;
uint16_t Ret;
uint16_t StartAndGetOneResult()//读取ADC数据
{Ret=HAL_ADC_GetValue(&hadc1);return Ret;
}HAL_ADCEx_Calibration_Start(&hadc1);//校准
HAL_ADC_Start(&hadc1);//只执行一次开始转换

1.4单次/连续非扫描总结

在无论是连续模式还是非连续模式下,一旦执行了 HAL_ADC_Start(&hadc1); 函数,ADC开始转换。

在非连续模式下,您需要使用 HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); 函数来 等待转换完成,然后使用 HAL_ADC_GetValue 函数来读取ADC值。此函数会阻塞直到转换完成或者 超时。

在连续模式下,由于转换持续进行,您可以直接使用 HAL_ADC_GetValue 函数来读取最新的ADC 值,无需等待转换完成。

1.5扫描连续模式多通道(非DMA)

代码读取ADC:

uint32_t ADC_Value[2];
HAL_ADC_Start(&hadc1);	//开始ADC转换
HAL_ADC_PollForConversion(&hadc1,10);	while (1){HAL_Delay(500);for(i=0;i<2;i++){if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)){ADC_Value[i] = HAL_ADC_GetValue(&hadc1);}HAL_ADC_Stop (&hadc1);//停止ADC}}

1.6扫描非连续模式多通道(DMA)

当我们使用多通道时候,最好还是使用DMA帮忙转运,反正又不占用CPU,上面的方法太鸡肋了,还会有数据丢失的风险!在规则组中的多次(扫描或非扫描)转换ADC出来的结果只有一个寄存 器存放假如不及时使用DMA转运出来数据就会覆盖掉。现在就是利用DMA转运多次ADC的结果。

Cube MX配置:

1ADC设置

1. 通道选择

2. 设置为扫描非连续模式

3. 设置需要转换的通道数为4

4. 设置每通道的顺序

2DMA设置

1. 使用Normal模式,对应keil中的 DMA_InitStruct.DMA_Mode=DMA_Mode_Normal; ,转换一次完成 后需要手动进行相关操作才能进行下次转运

2. 设置目标地址Memory存储结果为递增模式对应keil中的

DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;`,数据源地址已经自动设置为不可 选择递增模式

3. 由于ADC的结果是16位的,所以使用半字。对应keil中的

DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;

代码读取DMA转运数据:

编写读取函数:

uint16_t AD_Value[4];
HAL_StatusTypeDef hhStatue;void StartAndGetResult()
{//重新设置计数器,让它实现再次转运hhStatue=HAL_ADC_Start_DMA(&hadc1,(uint32_t*) AD_Value, 4);//开始ADC转换if(hhStatue!=HAL_OK)//读取失败{AD_Value[0]=0;AD_Value[1]=0;AD_Value[2]=0;AD_Value[3]=0;}while(hdma_adc1.State!=HAL_DMA_STATE_READY);//等待DMA转运数据完成HAL_ADC_Stop_DMA(&hadc1); //停止ADC转换
}

校准:

HAL_ADCEx_Calibration_Start(&hadc1);

使用例子:

uint16_t AD1;
uint16_t AD2;
uint16_t AD3;
uint16_t AD4;int main(void)
{HAL_Init();MX_GPIO_Init();MX_DMA_Init();MX_ADC1_Init();OLED_Init();OLED_Clear();HAL_ADCEx_Calibration_Start(&hadc1);OLED_ShowString(1,1,"AD1:");OLED_ShowString(2,1,"AD2:");OLED_ShowString(3,1,"AD3:");OLED_ShowString(4,1,"AD4:");while (1){StartAndGetResult();AD1= AD_Value[0];AD2= AD_Value[1];AD3= AD_Value[2];AD4= AD_Value[3];OLED_ShowNum(1,5,AD1,4);OLED_ShowNum(2,5,AD2,4);OLED_ShowNum(3,5,AD3,4);OLED_ShowNum(4,5,AD4,4);HAL_Delay(100);
}

1.7扫描连续模式多通道(DMA)

修改DMA设置:

修改为循环模式,对应标准库中的 DMA_InitStruct.DMA_Mode=DMA_Mode_Circular;

代码实现:
main函数(开始转换一次就要可以了):

uint16_t AD_Value[4];HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*) AD_Value, 4);

温馨提示:

 

由于使用的是ADC和DMA的循环模式,他们实现ADC转换并DMA转运一次是非常非常快的。而DMA中 默认开启了中断。每次ADC转换并DMA转运完成都会触发一次中断。使得单片机频繁被中断,没有时间 去处理其他任务了。解决办法就是把DMA中断关掉。在这里扫描连续模式下的ADC+DMA中断并没有什 么用处。把下面两个勾选去掉即可。重新烧录进去即正常获取。

1.8定时器通道输出(TRGO)触发ADC

前面的例子都是使用软件触发,通过一个简单的函数代码就可以轻松触发ADC开始转换!下面演示使用TIM3的TRGO事件来触发ADC。

实验效果:配置好定时器的频率,定时1秒钟,每过一秒钟,CNT就会溢出,定时器的TRGO触发,定时器是1S。1S更新一个ADC转换结果!

注意:即使是使用TIM的TRGO触发,也需要加上一次软触发时使用的代码。否则获取不到结果

HAL_ADC_Start(&hadc1);

我也不知道为什么,有知道的大佬可以告诉我!

CubeMX配置:

1、配置定时器

1. 使用内部时钟

2. 设置定时器相关参数,定时1秒钟。

3. 打开更新事件。

2、配置ADC(触发源设置为TIM3的更新中断

代码实现:

HAL_StatusTypeDef HalState;
uint16_t Ret;
uint16_t StartAndGetOneResult()
{HalState= HAL_ADC_PollForConversion(&hadc1, 10);//第二个参数是等待超时时间if(HalState == HAL_OK){Ret=HAL_ADC_GetValue(&hadc1);//获取转换结果}return Ret;
}uint16_t ADValue;
float Voltage;
int main(void)
{OLED_Init();OLED_Clear();HAL_ADCEx_Calibration_Start(&hadc1);HAL_TIM_Base_Start(&htim3); // 启动TIM3HAL_ADC_Start(&hadc1);//启动ADC转换OLED_ShowString(1,1,"ADValue:");OLED_ShowString(2,1,"Voltage:0.00V");while (1){ADValue= StartAndGetOneResult();OLED_ShowNum(1,9,ADValue,4);Voltage=(float) ADValue/ 4095 *3.3;OLED_ShowNum(2,9,(uint32_t)Voltage,1);OLED_ShowNum(2,11,((uint16_t)(Voltage * 100)) % 100,2);HAL_Delay(100);}
}

1.9其他更多触发方式

Regular Conversion launched by software 规则的软件触发 调用函数触发即可

Timer X Capture Compare X event 外部引脚触发,

Timer X Trigger Out event 定时器通道输出触发 需要设置相应的定时器设置

这里就不一一展示了,感兴趣的可以自己试一下!

可以参考这个图片:

示例:

选择捕获比较1事件(定时器1通道1的PWM或捕获)

这样就是捕获到上升沿就开始ADC转换!其他的也是类似原理!

 


文章转载自:

http://QjlzeaXV.jsxrm.cn
http://scdEjaeG.jsxrm.cn
http://MpuocUCy.jsxrm.cn
http://lA1UMPC0.jsxrm.cn
http://3T3EqJLX.jsxrm.cn
http://6aNtE2s7.jsxrm.cn
http://PhrMazfb.jsxrm.cn
http://4trYU2gB.jsxrm.cn
http://pWbuLY7H.jsxrm.cn
http://VWCcplPX.jsxrm.cn
http://T1164yAg.jsxrm.cn
http://SKaOKrWD.jsxrm.cn
http://5SRGTrWh.jsxrm.cn
http://mLLNSlal.jsxrm.cn
http://0Smpo7Fl.jsxrm.cn
http://pm3lSg2T.jsxrm.cn
http://xYO0Dsbp.jsxrm.cn
http://2aKdkGAT.jsxrm.cn
http://bAzmCFV6.jsxrm.cn
http://FYoZW7Qq.jsxrm.cn
http://zJ8s67Kw.jsxrm.cn
http://ts265U4d.jsxrm.cn
http://4A28f1HI.jsxrm.cn
http://seBLjXkf.jsxrm.cn
http://MlbkaOa1.jsxrm.cn
http://CIZJjzHh.jsxrm.cn
http://t16Cdfpd.jsxrm.cn
http://pIvjn74W.jsxrm.cn
http://UgTIzwWg.jsxrm.cn
http://0QVvi0hw.jsxrm.cn
http://www.dtcms.com/wzjs/722831.html

相关文章:

  • 网站建设主要工作流程西安设计工作室
  • 网络违法犯罪举报网站网页设计板式网站
  • 小型网站用typescript南阳专业网站建设价格
  • 网站可以做充值吗北京丰台网站建设
  • 西安巨久科技网站建设校园网站建设培训稿
  • 网站建设在医院的作用百度app浏览器下载
  • 有服务器了怎么做网站营销型网站建设市场分析
  • wordpress个人网站后台登陆西安网站制作顶尖公司
  • 饰品网站模板网页游戏制作教程
  • 成都动力无限 网站 差网站建设官方商城
  • 绵阳网站建设怎么做贵州城乡住房和建设厅网站
  • 如何建立公司网站南通佛山附近做网站的公司
  • 网络营销的主要形式有建设网站兴安盟seo
  • 动漫做a视频网站win10优化
  • 河东区腾讯网站建设华为云云速建站
  • 网站员工风采深圳建筑设计师招聘信息
  • dw做的网站怎么放到服务器上个人网站代码编写
  • 成立门户网站建设工作小组给教育类做网站
  • 大连 网站wordpress怎么引用新浪ajax
  • 个人建立网站后怎么盈利做家教网站
  • 平顶山做网站的公司搭建一个网站需要哪些技术
  • 建设网站费用分析国外媒体报道
  • 3d 代做网站个人网站二级域名做淘宝客
  • 杭州余杭网站建设南宁网页设计培训学校
  • 青岛专业网站建设定制免费图片制作生成器
  • 网站建设应解决的问题买购网
  • 太原推广型网站建设wordpress转换为html
  • 利用表单大师做网站深圳发布稳增长措施
  • 做水晶接单在哪个网站接简单班级网站模板
  • 手机网站免费模板下载郑州做网站哪家专业