库函数版本
寄存器版本
常用外设配置流程
PWM配置
1:使能相应TIM时钟;
2:使能相应输出端口的时钟;
3:将端口引脚配置成复用输出引脚模式,设置相应输出速度/输出模式(推挽或者开漏)
4:设置计数器重装值/预分频系数/占空比;
预分频系数是对TIM的时钟进行分频,这个频率通常来自外部时钟倍频(PLL)又分频(DIV)
5:选择定时器模式(计数方式/极性);
6:使能比较输出;
7:使能计时器。
芯片引脚模式:
输入:
浮空输入 :引脚悬空,由外部电路决定;
上拉/下拉输入:引脚悬空,通过上拉/下拉电阻接到高电平/低电平;
模拟输入:用于连接ADC的输入。
输出:
推挽输出:能够强上下拉,输出高低两种电平;
开漏输出:只能输出低电平,输出高电平需要加上拉电阻(弱上拉);
复用输出:使用一个引脚的其他功能。
开漏输出、推挽输出:
推挽输出:由两个mos管组成,可以输出高低两种电平,由Vin决定,且输出高低电平都有驱动能力。不能实现线与,如果一个输出高,一个输出低,就短路。强上下拉。
开漏输出:只能输出低电平,需要借助外部上拉电阻才能输出高电平。可以实现线与。51单片机P0口需要外加上拉电阻就是因为,P0口驱动能力不行。与推挽不同的是,采用上拉电阻的方式进行输出的方式称为弱上拉。
ADC配置
GPIO读取只能读取到高/低电平,要想对高低电压范围内的任意电压进行量化,就需要将引脚配置为模拟输入,设置为ADC。ADC读取后的模拟电压,转换为一个数据,存放在寄存器中(ADCx->DR)。U采样电压=ADCx->DR*基准电压Uref/2ADC位数
采样精度=基准电压Uref/2ADC位数,由基准电压和ADC位数决定。
分辨率=2ADC位数,由ADC位数决定。
采样率:代表一个周期的采样次数。采的越多,越接近原待测模拟信号。
ADC有很多实现方式,其中并联比较器型是速度最快且原理最简单的一种。
并联型ADC原理是①首先对所选待测电压范围通过n个电阻分压将电压分成n份,作为比较器的基准电压(阈值)②用比较器进行待测模拟信号和阈值的比较③通过触发器、锁存器保存比较器的输出④通过优先编码器,实现多位m到少位n的互转m=2^n,于是可以得到模拟电压的大小了;可以通过增加比较器及其对应的触发器、锁存器的个数达到增大ADC的转换精度。
逐次逼近型ADC原理是①首先对所选待测电压范围电压分成2份,作为比较器的基准电压(阈值)②用比较器进行待测模拟信号和阈值的比较③根据比较的结果对分辨率中最高位MSB进行置1或者清0④根据待测模拟信号是大于(或者小于)阈值,再将阈值调整至原处3/4(1/4)进行比较,对分辨率中次高位进行置1或者清0⑤如此循环,直到最低位LSB也确定。
∑-Δ型ADC、积分型ADC
普通ADC:多路开关一次只能选中某一路通道,开始转换,等待转换完成放在数据寄存器,取出结果
高级ADC:一次能同时选中多路开关,注入组可选用4路通道,规则组可选用16路,开始转换,等待转换完成放在相应数据寄存器(注入通道数据寄存器4*16位/规则通道数据寄存器16位(一般配合DMA),1次性可以转换16个通道,但是对应的规则组数据通道数据寄存器只有一个,需要配合DMA,利用DMA将其余15个保存起来,否则会数据覆盖),取出结果
ADC_配置流程:
1.使能对应端口/对应功能/复用
1选择通道:1路或者多路,多路采用什么方式
2触发转换:
触发ADC转换的方式有软件触发(SWSTART置1)和硬件触发。
ADC需要固定一段时间转换一次,可使用定时器每隔一段时间申请一次中断,在中断中申请一次转换,但频繁进中断对程序有影响。
若采用软件触发,可以使用定时器定时,在定时器中断服务函数里,进行手动的将SWSTART置1,转换开始,硬件将该位置1;若采用硬件触发,即使用定时器硬件触发中断。定时器框图有一个TRGO信号,可用来触发ADC。在ADC处,选择触发信号为TRGO,就能通过硬件自动触发ADC转换了。
3转换完成EOC标志为1,CPU会将转换完成的数据搬到ADC->DR/ADC->JDR这个寄存器;
4读取完ADC->DR寄存器后,硬件自动将EOC清0。一种方法是手动读取数据寄存器的值,在多路转换的规则通道需要DMA将数据寄存器的值读取出来并保存,DMA是怎么触发转运的呢?当ADC设置好了DMA方式,在EOC标志位为1时,CPU就知道不该由自己读取ADC->DR的值,而是由DMA将转换完成的数据搬走。在DMA搬走数据后,即传输完成会向CPU报告,我把数据全部搬走了,然后CPU就可以对搬走的数据进行处理了。
DMA搬运数据中存在着有两种数据覆盖①通道内部:通道x+1覆盖通道x(通过存储器地址自增解决);②转换之间:下一次转换覆盖上一次转换(通过下述两种方式解决)。:①要么是开辟一个大的SRAM空间,每次DMA传输完成n个通道的值,就让SRAM(Buf)地址加n;②CPU开辟与通道数目相同大小的数组空间,每次都把这些通道的转换数据搬到固定SRAM中,DMA传输完成,就把他们放在新的数组中,让新数组地址加1;
Voltage=ADC->DR/4095*3.3。
ADC工作模式:①单次/连续转换②扫描模式/非扫描模式③左/右对齐④校准⑤转换触发方式
单次/连续转换:开启转换后,是否需要再次触发才能转换。,单次的话,经过一次转换时间后,,需要再次触发,开启转换;连续转换,触发一次转换后,就会自动接着转换,不需要再次触发。
扫描/非扫描模式:扫描模式下,ADC所有通道都会被关注;非扫描下,只会关注一个一个通道。
左/右对齐:ADC12位,寄存器16位。一般使用右对齐,高位补0。左对齐将12位ADC变为8位。
转换触发方式:硬件触发和软件触发 ,一般使用软件触发,想得到adc值的时候就触发,不是任何时刻都想得到adc的值。
1)输入幅值和参考电压:输入电压范围在参考范围内部。(03.3V)->(04095)
2)分辨率:ADC能分辨的最小信号的能力。=参考电平max*2^12,1us转换
3)精度:实际数字输出和理论输出的误差。
4)ADC时钟:挂载在APB2上(Max=72M),最大输出14MHz,一般设置为12M。
一般来说:采样周期=转换周期+读取周期,最大1us转换,要求采样频率不能比1M高。
https://www.bilibili.com/video/BV1th411z7sn?p=21&vd_source=845273a9efce603add87ad2d53be0027
https://blog.csdn.net/qlexcel/article/details/95333042