本帖最后由 济颠进京 于 2018-10-18 09:55 编辑
本人在用正点原子探索者开发板采集一个电压波形,连续采集模式,但是通过串口助手返回来的数据只有两次的转换数据,哪位大神能帮忙出个主意,谢谢。附上源码
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "adc.h"
int main(void)
{
u16 adcx;
float voltage_show;
Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz
delay_init(168); //延时初始化
uart_init(84,115200); //初始化串口波特率为115200
Adc2_Init(); //初始化ADC2
while(1)
{
adcx=Get_Adc2();
voltage_show=(float)adcx*(3.3/4096);
printf("the voltage is %f
",voltage_show);
}
}
[/mw_shl_code]
下面是ADC部分
[mw_shl_code=c,true]#include "adc.h"
//初始化ADC
//ADC1 以连续采样模式工作 单一CH5
void Adc2_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<9; //使能ADC2时钟
RCC->AHB1ENR|=1<<0; //使能PORTA时钟
GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_NONE); // PA5模拟输入,不带上下拉电阻
RCC->APB2RSTR|=1<<8; //ADCs复位
RCC->APB2RSTR&=~(1<<8); //复位结束
ADC->CCR|=1<<16; //ADCPRE: ADC时钟 ADCCLK=PCLK2/4=84/4=21Mhz
//ADC挂载到APB2总线上,ADC时钟最好不要超过36Mhz
ADC2->CR1=0; //CR1设置清零
ADC2->CR2=0; //CR2设置清零
ADC2->CR1&=~(3<<24); //RES:12位分辨率模式,(15个时钟周期总转换时间)
ADC2->CR2&=~(1<<11); //ALIGN:右对齐
ADC2->CR2|=1<<10; //EOCS:设置规则通道 每单次转换完成EoC标志 置位;
ADC2->CR2|=1<<1; //CONT: 连续转换
ADC2->SQR1&=~(15<<20); //L:设置规则通道序列总数为1
ADC2->SQR3|=5<<0; //SQ1:设置规则序列第一次转换为通道5
//设置通道5 的采样时间
ADC2->SMPR2=0; //所有通道采样时间清空
ADC2->SMPR2&=~(7<<(3*5)); //SMP5:通道5采样时间:3个周期
ADC2->CR2|=1<<0; //ADON: 开启AD转换器
ADC2->CR2|=1<<30; //SWSTART: 开启规则通道转换
}
//获得ADC值
//返回值:转换结果
u16 Get_Adc2(void)
{
while(!(ADC2->SR&(1<<1))); //等待转换结束
return ADC2->DR; //返回adc值同时硬件自动清除EoC标志位
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>