当前位置:文档之家› ADC模拟量的采集

ADC模拟量的采集

#include "pbdata.h"
#include "Lin_stm32.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);
void ADC_Configuration(void);
//u32 d1=12345;
//float d2=12.3456;
//u8 d3='a';
//u8 d4[]="abcdef";
u32 ad;
u8 i;
int fputc(int ch,FILE*f)
{
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return ch;
}

int main(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
USART_Configuration();
ADC_Configuration();
while(1)
{
//printf("林兵兵\r\n");
//printf("https://www.doczj.com/doc/d917147403.html,\r\n");
//printf("10进制整型输出 d1=%d\r\n",d1);
//printf("16进制整型输出 d1=%10X\r\n",d1);
//printf("浮点数输出 d2=%10.2f\r\n",d2);
//printf("字符输出 d3=%c\r\n",d3)
for(i=0;i<50;i++)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
ad=ad+ADC_GetConversionValue(ADC1);
}
ad=ad/50;
printf("ad=%f\r\n",3.3/4095*ad);

delay_ms(3000);
}
}

void RCC_Configuration(void)
{
SystemInit();//系统时钟设置72MHz

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//挂接外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//挂接外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//挂接外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//挂接外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//挂接外设
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHz
}
void GPIO_Configuration(void)//端口初始化
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_https://www.doczj.com/doc/d917147403.html,ART_BaudRate=9600;
USART_https://www.doczj.com/doc/d917147403.html,ART_WordLength=USART_WordLength_8b;
USART_https://www.doczj.com/doc/d917147403.html,ART_StopBits=USART_StopBits_1;
USART_https://www.doczj.com/doc/d917147403.html,ART_Parity=USART_Parity_No;
USART_https://www.doczj.com/doc/d917147403.html,ART_HardwareFlowControl=USART_HardwareFlowControl_

None;
USART_https://www.doczj.com/doc/d917147403.html,ART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
}

void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_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_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);//规则组初始化
ADC_Cmd(ADC1,ENABLE);//ADC1使能
ADC_ResetCalibration(ADC1);//进行复位
while(ADC_GetResetCalibrationStatus(ADC1));//判断是否复位完成

ADC_StartCalibration(ADC1);//校准函数
while(ADC_GetCalibrationStatus(ADC1));//是否校准完成

ADC_SoftwareStartConvCmd(ADC1,ENABLE);//执行转换功能
}

#include "pbdata.h"

void delay(u32 nCount)
{
for(;nCount!=0;nCount--);
}

void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=9*nus;
SysTick->VAL=0x00;//清空计数器
SysTick->CTRL=0x01;//使能,减到零无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前计数器值
}while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL=0x00;//关闭计数器
SysTick->VAL=0x00;//清空计数器
}

void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=9000*nms;
SysTick->VAL=0x00;//清空计数器
SysTick->CTRL=0x01;//使能,减到零无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前计数器
}while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL=0x00;//关闭计数器
SysTick->VAL=0x00;//清空计数器
}

void RCC_HSE_Configuration(void)//系统时钟初始化(自定义)
{ //HSE作为PLL时钟,PLL作为SYSCLK
RCC_DeInit();//将外设RCC寄存器设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE),HSE晶振
if(RCC_WaitForHSEStartUp()==SUCCESS)
{//等待HSE起振,SUCCESS;HSE晶振稳定且就绪
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK),RCC_SYSCLK_Div1_AHB=
//时钟=系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL时钟源及倍频系数,8*9=72MHz
RCC_PLLCmd(ENABLE);//Div1->1分频,Div2->2分频,改参数,PLL锁相环
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)
while(RCC_GetSYSCLKSource()!=0x08);
}
}


#include "Lin_stm32.h"
#include "pbdata.h"
u8 temp;


void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USAR

T_IT_RXNE)!=RESET)//检查发中断生是否
{
temp=USART_ReceiveData(USART1);//接收数据

USART_SendData(USART1,temp);//把接收到的数据发送

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//判断
}
}

#ifndef _pbdata_H
#define _pbdata_H

#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
#include "stm32f10x_adc.h"
void delay(u32 nCount);
void delay_us(u32 nus);
void delay_ms(u16 nms);
void RCC_HSE_Configuration(void);

#endif

#ifdef _Lin_stm32_H
#define _Lin_stm32_H

#include "stm32f10x.h"
void USART1_IRQHandler(void);

#endif

相关主题
文本预览
相关文档 最新文档