| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32F103(十八)ADC总结(5W字) -> 正文阅读 |
|
[嵌入式]STM32F103(十八)ADC总结(5W字) |
学习板:STM32F103ZET6 ADC
一、ADC简介1、详述ADC(Analog Digital Converter),顾名思义为模拟to数字转换,将模拟信号转化为一定比例的电压值。对于32的GPIO来讲,通常只有高电平和低电平之分,即当识别到高电平时并不能知道是3.3V还是3.2V。使用ADC后就可以很好的检查出电平具体是多少伏特了。所以不要把ADC单纯的理解为模拟->数字的转换,而要理解为未知(伏值)信号—>已知(伏值)信号的转换。 可以这样理解,当一个信号输入的MCU时,哪怕它是模拟信号,由于MCU的识别占用一定时间,所以看似是识别模拟信号,其实信号已经算是抽样信号了。 学过《信号与系统》的朋友应该知道模拟信号、抽样信号、数字信号的区别。现再区别一下: 通过《信号与系统》我们知道,模拟信号到数字信号必须经过抽样和量化。 再回到ADC内容,如果将模拟信号输入到单片机的GPIO,由于单片机的识别有一定时间,如每识别一次信号需要1us,则此时单片机其实已经将模拟信号自动转换为时间间隔为1us的抽样信号。但是仅仅是抽样信号,单片机只知道它是每隔1us的信号是高电平还是低电平,并不知道它具体幅值多少。那么通过ADC,可以较为准确的将幅值量化(经过量化就变成数字信号了)。量化的幅值范围与设置的参考电压有关,将幅值量化到参考电压范围内。 2、STM32的ADC数量和通道数STM32拥有1~3个ADC,具体几个与芯片型号有关系。都是采用12位逐次逼近型模数转换器,有18个通道,其中16个通道测量外部输入,2个为内部信号源检测(注意不是外设),从芯片图中也能看到,下图已高亮: 归结为下图: 3、STM32的ADC时钟上图红色箭头显示,ADC的最大时钟为14MHZ。图中绿色标注和蓝色标注是底层中的设置的各类时钟。系统时钟为72MHZ,AHB预分频系数为1,则ADC预分频系数必须大于等于6,所以我习惯把预分频系数设置为6,此时ADC的时钟频率为12MHZ。 4、STM32的ADC转换速率ADC转换时间=采样时间+12.5个时钟周期 这个采样时间可以设置,最小为1.5个时钟周期 所以最大转换速率=1.5+12.5=14(个时钟周期),ADC最大时钟频率为14MHZ,则14个时钟周期为1us,即最快时(采样周期最小、时钟最大)为1us 5、STM32的ADC规则通道和注入通道ADC的规则通道和注入通道很好理解。正常情况下只需使用规则通道,规则通道最多16个通道转换,根据实际需求选择转换通道数量。如有8路信号,则可以把每一路信号接ADC的不同引脚,并都可设置为规则通道,此时有8个规则通道。 注入通道就可以把它看做是中断。当执行某一功能的ADC转换A时,突然想执行另一个ADC转换B,这样需要中断此时的ADC转换A去执行ADC转换B,此时可用将转换A设置为规则通道,转换B设置为注入通道。注入通道最多有四个。这个控制触发注入通道的信号可用是内部信号、外部中断、定时器输入捕获通道的信号。 6、ADC框图(比较重要)上图中: 红色框框是ADC的0~15的16个外部通道、内部温度传感器和VREFINT两个内部通道。 蓝色框框是参考电压、供电电压。ADC量化后输出负参考电压~正参考电压直接的值;一般参考电压为0 ~3.3V;VDDA和VSSA给ADC的模数转换器供电 如下图所示: 黄色框框是设置中断、看门狗。当规则通道转换结束后ADC状态寄存器ADC_SR位1(EOC)硬件置1,当注入通道转换结束后ADC状态寄存器ADC_SR位2(JEOC)硬件置1。如果使能了ADC中断,则会进入中断服务函数。 深蓝色框框是ADC模拟看门狗,ADC输入的模拟电压值幅值要在一定范围内,这个范围在下面俩个寄存器中设定。当输入电压低于低阈值或高于高阈值时ADC模拟看门狗被激活。注意这个看门狗可以作用于1个或多个通道,且只需将对应通道的ADC转换重新复位,程序不用完全复位。 二、ADC相关寄存器1、 ADC状态寄存器(ADC_SR)位0:模拟看门狗标志位 当输入的模拟信号低于低阈值或高于高阈值时(ADC_LTR和ADC_HTR寄存器定义),该位硬件置1,发生看门狗事件。 位1:转换结束标志位 当只进行规则通道转换时,各通道转换结束后该位置1;当一次ADC转换期间包含了注入通道转换,则当规则和注入通道转换都结束后该位才置1 。(相当于中断返回后继续执行完本通道转换才置1) 位2:注入通道转换结束标志位 当注入通道转换结束(可能一次“中断”有多个注入通道转换,需要全部结束)后该位硬件置1。 位3:注入通道开始标志位 位4:规则通道开始标志位 当然在程序中可以通过识别该寄存器的对应位来得到状态,如判断注入通道转换是否结束,代码:
2、 ADC控制寄存器 1(ADC_CR1)(极其重要)位4:0:模拟看门狗通道选择 需要注意的是ADC1的16个外部通道和2个内部通道都用到了。而ADC2、ADC3的通道只用到一部分。 位5:允许产生EOC中断位 当规则通道全部转换完成后,SR寄存器的位1位硬件置1,如果CR1寄存器位5置1允许中断,则会发生中断。 位6:允许产生模拟看门狗中断位 如果输入模拟信号的电源低于低阈值或高于高阈值,会发生错误,如果允许了看门狗,则会重新执行通道转换。如果该寄存器位6置1,允许产生看门狗中断,则会发生中断。 位7:允许产生注入通道转换结束中断位 当注入通道转换结束后,寄存器SR的位2硬件置1表示结束。当CR1寄存器位7置1允许中断时,会产生中断。 位8:扫描模式设置位 该位设置连续扫描模式,当该位值1时,会扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的通道。且每个通道只转换1次,一个通道转换结束后,会自动转换下一个通道,当所有选中的通道都被转换一次后,再重新开始转换所有通道。 如果设置了规则通道和注入通道中断,当所有通道都被转换后才能发生中断。 如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中。 位9:扫描模式中单一通道使用模拟看门狗 当位8置1设置了扫描模式,每个选中的通道都会进行一次转换。对于单个通道,如果输入模拟信号低于设置的低阈值或高于设置的高阈值会触发看门狗,并重新执行对应通道的转换。 位10:自动的注入通道组转换 之前也总结过,注入通道转换时要触发,有外部中断触发、定时器输入捕获通道信号触发、定时器内部信号源触发。如果位10置1设置自动注入通道转换,则不再需要触发,当所有规则通道执行完毕后,自动执行注入通道转换。 位11:规则通道上的间断模式 这个间断模式细讲一下: 其次间断模式的哪几个通道:转换的所有通道时SQRx(1~3)选择的通道。SQRx设置了一个转换序列的通道次序。 以上说的是规则通道,注入通道也一样,不过注入通道的序列长度、通道顺序都在JSQR寄存器中设置。 如:JSQR寄存器位21:20=11,表示4个注入通道,然后位19:15、14:10、9:5、4:0分别设置注入通道顺序。注入通道:15、10、13、12 第五次外部触发:转换通道15… 注意:自动注入和间断模式不能同时使用 位19:16:双模式选择 这个了解即可,反正我从来没用到过。可以查看中文参考手册了解了解。 位23、位22:规则通道、注入通道开启模拟看门狗 3、 ADC控制寄存器2(ADC_CR2)位0:开/关A/D转换器
即开启AD转换时最好单独成行:
位1:连续转换设置位 如果设置该位设置了1,则前面的ADC转换(整个序列)刚结束就开启另一次转换。不过每个规则通道转换结束后都能产生结束标志(SR寄存器)、都可产生中断(如果使能了中断)。注入通道也一样。 位2:A/D校准 ADC内置一个自校准模式,可大幅减小因内部电容器组的变化而造成的准精度误差,校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。 当校准结束后,该位会被硬件置1 注意校准时机,一般在ADC上电之前校准,校准完成后,只是隔2个ADC时钟周期再启动ADC。 位3:复位校准 由软件设置,硬件清零,一般情况下可以不用。 位8:直接存储器访问模式 设置DMA 位11:设置数据对齐 通道转换数据会存储在DR寄存器,DR寄存器为32位寄存器,除了双模式下用到高16位,其他情况下通道转换数据都存储在低16位中,上图所示的对齐,一般采用右对齐,即该位置0 位14:11:选择启动注入通道组转换的外部事件 之前也总结到,启动注入通道时,需要外部中断触发、定时器捕获通道信号触发、定时器内部信号源触发,这3位就是来设置触发方式的。 位15:选择启动注入通道组转换的外部事件 位19:17:选择启动规则通道组转换的外部事件 位20:规则通道的外部触发转换模式 位21:开始转换注入通道 位22:开始转换规则通道 位22:温度传感器和VREFINT使能 4、ADC采样时间寄存器 1(ADC_SMPR1)和 ADC采样时间寄存器 2(ADC_SMPR2)ADC_SMPR1寄存器来设置通道10~17的采样时间,每3位设置一个通道。 ADC_SMPR2寄存器来设置通道0~9的采样时间,每3位设置一个通道。 当然可以不设置,这样采样时间就默认为1.5个周期,此时也是通道转换最快的情况。 5、 ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x=1…4)
该寄存器中存储的偏移量只用于注入通道的数据对齐,而对规则通道无效。 目的是将注入通道的转换的数据值减去该寄存器存储的偏移量,让这个值可以为负数,并储存在ADC_JDRx寄存器中。 6、ADC看门狗高阀值寄存器(ADC_HTR)和ADC看门狗低阀值寄存器(ADC_LRT)这两个寄存器来设置模拟看门狗的上下限的,设置了上下限后,ADC的模拟输入幅值就有了一个范围限定,如果模拟输入超过这个上、下限范围,会触发模拟看门狗,重新转换对应通道,程序不会跳转到下一通道的采集。 7、ADC规则序列寄存器 1~3(ADC_SQR1 ~3)(重点说明一个东西)
这三个寄存器用来设置某次AD转换中所有规则通道的转换次序,如果多路信号输入,由于选用的引脚不同,即可能不是只用到前几个通道,通道占用是打乱的,那么怎么才能有序的识别出来呢? 位9:5(序列中第二个要转换的通道序号)值5,表示第二个转换通道是通道5,所以位9:5=0x00101 位14:10(序列中第三个要转换的通道序号)值2,表示第三个转换通道是通道2,所以位14:10=0x00010 位19:15(序列中第四个要转换的通道序号)值10,表示第四个转换通道是通道10,所以位19:15=0x01010 位24:20(序列中第五个要转换的通道序号)值14,表示第五个转换通道是通道14,所以位24:20=0x01110 位29:25(序列中第六个要转换的通道序号)值3,表示第六个转换通道是通道3,所以位29:25=0x00011 ADC_SQR2寄存器: 位4:0(序列中第七个要转换的通道序号)值4,表示第七个转换通道是通道4,所以位4:0=0x00100 8、ADC注入序列寄存器(ADC_JSQR)该寄存器与SQRx(1~3)类似,用来设置注入通道序列顺序的。 接上面例子,将第8、9、10三路信号作为注入通道信号。 第八路信号使用ADC通道6、则JSQR寄存器位4:0=6,表示注入序列执行的第一个通道为通道6,位4:0=0x00110 第九路信号使用ADC通道7、则JSQR寄存器位9:5=7,表示注入序列执行的第二个通道为通道7,位9:5=0x00111 第十路信号使用ADC通道8、则JSQR寄存器位14:10=8,表示注入序列执行的第三个通道为通道8,位14:10=0x01000 9、ADC 注入数据寄存器x (ADC_JDRx) (x= 1…4)
10、ADC规则数据寄存器(ADC_DR)用来储存规则序列的各通道转换结果也需要及时读取,否则会覆盖。 三、ADC相关库函数ADC的函数主要集中在stm32f10x_adc.h中
1、ADC时钟设置函数RCC_ADCCLKConfig()该函数在stm32f10x_rcc.h中 表示几分频后作为ADC时钟。上图红色箭头所示,ADC最大时钟频率是14MHZ,默认状态下系统时钟是72MHZ,故至少需要6分频,所以一般情况下设置参数为 2、ADC初始化函数ADC_Init()(+扫描模式和连续转换区别)
(2)参数2 ①ADC_Mode 正常情况先选则独立模式: ②ADC_ScanConvMode 选择是否开启扫描模式,对于多个规则通道来讲,可以开启扫描模式,每个通道都循环转换;或者想一直显示,可以开启扫描模式。核心意图就是是否让ADC不停的去转换。对于单次转换,可以不设置扫描模式。 ③ADC_ContinuousConvMode 这里区分一下连续转换和扫描模式的区别: 举个例子: 假如有5个规则通道的序列,且规则序列的顺序被设置好了,转换顺序为A、B、C、D、E 扫描模式下:
所以扫描模式要配合DMA使用的。 ④ADC_ExternalTrigConv ⑤ADC_DataAlign ⑥ADC_NbrOfChannel 设置规则序列长度,即设置使用ADC几个通道。 3、ADC使能函数ADC_Cmd()
参数2: 4、ADC的DMA使能函数ADC_DMACmd()参数1: 参数2: 这个函数使能了DMA,但是DMA还需要另外设置,这个之后博客会有专门一篇博客来总结。 5、ADC中断使能函数ADC_ITConfig()参数1: 参数2: 参数3: 6、ADC初始化取消函数ADC_DeInit()从函数体上也可以看到,将ADC的寄存器设置为缺省值。 7、ADC结构体初始化函数ADC_StructInit()
8、ADC复位校准函数ADC_ResetCalibration()参数: 是对CR2寄存器位3的操作。 9、获取复位校准状态函数FlagStatus ADC_GetResetCalibrationStatus()参数: 选择哪个ADC 看一下函数体: 当处于复位校准状态时,CR2寄存器位3为1,此时执行:
后值为1 当复位校准完成后,位3硬件置0,执行:
后值为0。 10、ADC校准函数ADC_StartCalibration()该函数是对CR2寄存器位2的操作 11、获取ADC校准状态函数FlagStatus ADC_GetCalibrationStatus()当处于校准状态时,CR2寄存器位2为1,此时执行:
后值为1 当复位校准完成后,位2硬件置0,执行:
后值为0。 12、启用或禁用ADC软件转换函数ADC_SoftwareStartConvCmd()
参数2: 当参数为ENABLE时:
此时CR2寄存器的位22和位20都为1,即使用外部时间触发转换,并同时开启转换通道(虽然打开,但只有当外部信号到了触发完成后才开始转换)。 故当参数为ENABLE是选择外部触发来开启转换 当参数为DISABLE时:
此时CR2寄存器的位22和位20都为0,即不使用外部时间触发转换,并关闭转换通道 13、ADC软件开启转换状态获取函数FlagStatus ADC_GetSoftwareStartConvStatus()
该函数是对CR2寄存器位22的操作
后的值为1,返回SET。 当转换通道未开启时,该位为0,执行
后的值为0,返回RESET。 故返回SET时表示转换通道开启,返回RESET时表示转换通道未开启。 14、ADC间断模式下通道数设置函数ADC_DiscModeChannelCountConfig()
参数2:
第一行是把CR1目前的状态赋值给tmpreg1 。 第二行是 第三行对第二个参数Number -1,因为输入1的时候表示间断模式下一次转换的通道数是1,此时位15:13=0,故位15:13的值与Number 相差1. 第四行对tmpreg2 先左移13位后Number - 1的值与位15:13对齐了,然后或运算,覆盖位15:13 第五行直接赋值,对CR1寄存器的位15:13重新赋值。 15、ADC间断模式使能函数ADC_DiscModeCmd()
参数2: 16、ADC规则通道设置函数ADC_RegularChannelConfig()参数1: 参数2: 参数3范围是1~16,对应SQR1 ~3寄存器,之前非常详细的说过。 参数4: 参数4是选择采用时间。 17、外部触发转换设置函数ADC_ExternalTrigConvCmd()
这个函数与本目: 18、获取ADC转换值函数uint16_t ADC_GetConversionValue()
19、返回DR寄存器值函数uint32_t ADC_GetDualModeConversionValue(void);
20、自动的注入通道转换设置函数ADC_AutoInjectedConvCmd()参数1: 参数2: 该寄存器是对CR1寄存器位10的操作 当第二个参数为ENABLE时开启自动注入通道转换,当参数为DISABLE时关闭自动注入通道转换。 之前也总结过,当自动注入通道转换时,每次执行完规则通道,都自动去执行注入通道。而注入通道是把它看做是“中断”来用的,所以这个自动注入通道转换需慎用! 21、注入通道上的间断模式设置函数ADC_InjectedDiscModeCmd()参数1: 参数2: 该函数是对CR1寄存器位12的操作。
22、启动注入通道组转换的外部事件设置函数ADC_ExternalTrigInjectedConvConfig()参数1: 参数2: 该函数是对CR2寄存器位14:12的设置。 23、外部事件触发注入通道转换的使能函数ADC_ExternalTrigInjectedConvCmd()参数1: 参数2:
24、软件触发注入通道使能函数ADC_SoftwareStartInjectedConvCmd()与 参数2: 该函数是对CR2寄存器位15和位21的操作 总觉得这个函数和12这个函数编写的反人类,能稍微改一下就好了。 当参数为ENABLE时,位15和位21都置1,表示使用外部事件启动转换并开始转换注入通道(虽然打开转换通道,但是只有外部触发信号到来之时才转换) 当参数为DISABLE时,位15和位21都置0,表示禁用外部事件启动注入通道,并关闭注入通道转换。 25、获取ADC注入通道状态函数FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus()
该函数是对CR2寄存器位21的操作。 注意当转换开始后硬件马上清除位21,所以转换过程中该函数返回的还是RESET,所以该函数慎用! 26、ADC注入通道设置函数ADC_InjectedChannelConfig()参数1: 选择哪个ADC 参数2: 大于等于1小于等于4表示在注入通道序列中参数2的通道所在序列中的第几位置。 参数4: 采用周期 27、注入通道序列长度设置函数ADC_InjectedSequencerLengthConfig()参数1: 参数2: 28、设置注入通道偏移量函数ADC_SetInjectedOffset()
参数2:
29、获取注入通道转换值函数uint16_t ADC_GetInjectedConversionValue()参数1: 参数2: 这个函数返回的JDR寄存器里的值,通过
30、模拟看门狗设置函数ADC_AnalogWatchdogCmd()
参数2:
31、模拟看门狗阈值设置函数ADC_AnalogWatchdogThresholdsConfig()
选择哪个ADC 参数2: 参数3: 上下限值不能超过0xfff,毕竟输入模拟信号的幅值要在这个阈值区间内,二转换值存储在12位寄存器中,故需要保证阈值上下限最大不能超过0xfff。 32、通道的模拟看门狗设置函数ADC_AnalogWatchdogSingleChannelConfig()参数1: 参数2: 该函数是对CR1寄存器位4:0的操作。通过该函数,设置对应通道使用模拟看门狗 33、启用或禁用温度传感器和Vrefint通道函数ADC_TempSensorVrefintCmd()
ENABLE或DISABLE 该函数是对CR2寄存器位23的操作。通过该函数使能了温度传感器通道和Vrefint通道 34、获取ADC转换状态函数FlagStatus ADC_GetFlagStatus()参数1: 参数2:
返回SET表示转换完成,返回RESET表示还在转换。 35、清除标志位函数ADC_ClearFlag()
选择哪个ADC 参数2: 选择哪个标志位,参数和上一个函数参数一样
36、获取中断状态函数ADC_GetITStatus()
参数2: 选择哪个中断
返回SET表示发生了中断,返回RESET表示未发生中断。 37、清除中断标志位函数ADC_ClearITPendingBit()
参数2: 38、最后说明ADC的库函数有点多,如果可以的话库函数和寄存器结合起来编程,因为有的库函数的确麻烦,还不如寄存器直接操作好。 四、ADC编程顺序1、使能GPIO时钟、使能ADC时钟使用 2、设置ADC时钟分频根据需要选择分频系数,要注意F1的ADC时钟最大为14MHZ,然后看看自己板子、底层默认系统时钟是多少、AHB预分频系数是多少然后选择ADC分配系数。 我的板子默认系统时钟72MHZ,AHB预分频系数为1。故选择ADC预分频系数为6,保证ADC时钟不超过14MHZ 使用 3、GPIO初始化使用 4、复位ADC使用 5、ADC结构体初始化(可以不用)使用 6、ADC初始化使用 7、设置规则通道序列如果需要几个规则通道转换,则需要设置每个通道的转换顺序,使用 8、注入通道序列长度设置(如果需要)使用 9、注入通道设置函数(如果需要)如果需要几个注入通道转换,则需要设置每个通道的转换顺序,使用 10、使能ADC使用 11、开启复位校准使用
12、开启ADC校准使用
13、设置规则通道使用 14、使能软件启动转换(或外部触发转换(如果需要))使用 15、获取转换值使用 16、最后说明这个顺序不固定,还有一些配置比如看门狗、中断什么的如果用到,需要配置。 因为外部触发或者软件触发不能单独对某一通道作用,即如果设置了多个通道,软件触发后,会全部开始转换,而又不是并列执行,所以最终结果只会是转换设置的序列的第一个通道,第一个通道转换完成后标志位置1,不在进行转换(单次转换)。而对于连续模式,也只能是单个通道的连续转换,对于扫描模式,虽然所有通道都可以执行,但是由于通道转换结果只存储在一个寄存器中断。 说的有点乱,总而言之,不能同时开启所有通道转换,不能同时接收到所有通道转换结果 所以最佳解决办法是把规则通道设置 五、例1(单通道转换一次)手中刚好有几块松下的激光位移传感器。 不过该传感器模拟输出是5V,STM32F1的ADC通道输入都是3.3V的。具体可以查看芯片手册,ADC引脚都是不带FT标志的,所以该传感器不能用。 所以举例就放弃用它了。 刚好手中有MC遥控器和接收机,接收机输出信号为PWM,且有8个通道,可以用来举例。其PWM波形如下: 1、题使用ADC1通道1(PA0),将MC接收机输出的PWM信号的幅值量化,并在串口中显示出来。 2、分析按照编程顺序一步步的来分析处理:
②设置ADC时钟分频 之前也说到过,一定要保证ADC时钟频率不超过14MHZ,我的板子外接25MHZ晶振,经过底层时钟配置(可自主修改,之前博客有过总结)后系统时钟为72MHZ,AHB预分频系数为1.所以到达ADC预分频器的时钟为72MHZ,故采用6分频。
③配置GPIO
④ADC复位 其实可以不用复位,上电后会自动清除寄存器,不过养成习惯,复位一下比较严谨。
⑤ADC初始化
⑥使能ADC
⑦复位校准、并等待校准
⑧ADC校准并等待校准
⑨编写获取函数 因为只有一个通道工作,故PA0通道设置为规则序列的第一位。
⑩结果转化 3、完整代码(1)adc.h代码
(2)adc.c代码
(3)main.c代码
4、效果上图红色框框为PWM高电平时的转换值,其他的为低电平时的值。因为没有输入捕获,不知道啥时候是高电平啥时候是低电平,而且还延时1s,完全打乱了转换,故这些结果都是随机高、低电平的。 六、举例(多规则通道,扫描模式转换)1、题使用ADC1通道0(PA0)、通道1(PA1)、通道4(PA4)、通道5(PA5)分别接MC接收机的四个信号,用ADC扫描模式转换输入信号的电平,并从串口中打印出来。 2、分析相比较例1,本例题多了三路信号所以只总结一下需要修改的部分。 (1)规则通道长度 (2)获取函数中,传递的参数不仅仅是通道了,还需要对应通道在规则序列中的序号。 3、完整代码(1)adc.h代码
(2)adc.c代码
(3)main.c代码
4、效果七、例3(单通道连续模式)1、题使用ADC1通道1的连续模式转换MC接收机的一路信号并从串口打印出来 2、分析在主函数中软件启动ADC1次,然后while循环例输出转换值,如果是连续模式,则会持续从串口打印输出,且数值上有变化。 需要改动的地方: 3、完整代码(1)adc.h代码
(2)adc.c代码
(3)main.c代码
4、效果数值上是有变化的,说明在不停的转换。 八、结束语本篇博客写的我身心疲惫呀,还想总结一下注入通道、看门狗、外部触发转换等,但是到最后还是放弃了,等度过这段烦躁期可能会回来继续总结这方面的东西。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 8:54:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |