发新帖我要提问
12
返回列表
打印
[STM32F1]

STM基础篇——ADC LCD试验

[复制链接]
楼主: aizaixiyuanqian
手机看帖
扫描二维码
随时随地手机跟帖
21
aizaixiyuanqian|  楼主 | 2018-1-22 20:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
硬件电路设计 本设计是将电位器输出端接到单片机的 PA1 管脚上,也就是通过 ADC1 的通道 1 进行 AD 转换。因此除了需要对 ADC 进行初始化外还需要对 PA1 端口进行配置。


使用特权

评论回复
22
aizaixiyuanqian|  楼主 | 2018-1-22 20:21 | 只看该作者
  初始化例程:
void adc_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Per
iph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M 最大 14M 设置 ADC 时钟(ADCCLK)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//重置指定的 ADC 的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取 ADC 重置校准寄存器的状态
ADC_StartCalibration(ADC1);//开始指定 ADC 的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定 ADC 的校准程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的 ADC 的软件转换启动功能
}

使用特权

评论回复
23
aizaixiyuanqian|  楼主 | 2018-1-22 20:21 | 只看该作者
主函数例程
int main()
{
u8 i,dat[6],j;
u16 value;
float ad;
TFT_Init();  //TFT 初始化
adc_init();  //ADC 初始化
LED_Init();  //LED 端口初始化
printf_init();//printf 初始化
TFT_ClearScreen(BLACK);
GUI_Show12ASCII(10,10,"This is a ADC1-Channel1-PA1 Check!",YELLOW,BLACK);
GUI_Show12ASCII(10,100,"The AD Value is:",YELLOW,BLACK);
while(1)
{
value=0;
for(i=0;i<10;i++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//转换结束标志位
value=value+ADC_GetConversionValue(ADC1);//返回最近一次 ADCx 规则组的转
换结果
}
if(j>1)
{
j=0;
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}
else
{
j++;
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
delay_ms(100);
value=value/10;
ad=value*3.3/4096;
value=(u16)(ad*100);
dat[0]=value/100+0x30;
dat[1]='.';
dat[2]=value%100/10+0x30;
dat[3]=value%100%10+0x30;
dat[4]='V';
dat[5]='\0';
GUI_Show12ASCII(160,100,dat,RED,BLACK);
}
}

使用特权

评论回复
24
aizaixiyuanqian|  楼主 | 2018-1-22 20:22 | 只看该作者
主程序的效果是,读取到的 AD 值通过 LCD 彩屏进行显示,并且 LED 指示灯闪烁表示系统正在运行。

使用特权

评论回复
25
aizaixiyuanqian|  楼主 | 2018-1-22 20:23 | 只看该作者
ADC数据采集相对比较简单,我们可以在很多方面加以利用,后续将采集各种传感器。感谢大家支持。

使用特权

评论回复
26
mmuuss586| | 2018-1-22 21:26 | 只看该作者
感谢分享;

使用特权

评论回复
27
mmuuss586| | 2018-1-22 21:26 | 只看该作者
感谢分享;

使用特权

评论回复
28
一路向北lm| | 2018-1-23 12:12 | 只看该作者
有一种分享叫做**不懈,很棒。

使用特权

评论回复
29
123456cm| | 2020-7-5 11:06 | 只看该作者
有源代码吗

使用特权

评论回复
30
zhoujunfeng| | 2020-7-9 15:04 | 只看该作者
很详细

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则