这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STM32F103ZE学习笔记(ADC)

共8条 1/1 1 跳转至

STM32F103ZE学习笔记(ADC)

高工
2012-12-03 17:29:52     打赏
实验内容:单通道规则采样,将采到的电压经AD转换后,经由串口发送到上位机
实验目的:简单的了解ADC的配置及其采样规则,为下一步深入做好准备
教训总结:配置PC1  为ADC1的第11采样通道,循环采样,将采到的值处理后,经串口发送到上位机。在进行数据处理的时候一定要注意ASCII值与想要在上位机界面看到的值之间的区别,此部分的测试较为纠结,中间时隔好几天,主要有以下几点:参考电压的配置,是否是能内部温度和内部参考电压通道;对侧到的数据的处理,起初没有注意到ASCII与串口输出显示的内容之间的差别,一直误以为是设置的错误,反复试验考证,耽搁了不少时日。
源代码奉上:
main.c
#include "stm32f10x.h"
#include "led.h"
#include "uart.h"
#include "adc.h"
#include "nvic.h"
int main(void)
{
  Nvic_Init();
  Adc_Init();
  Uart1_Init();
 
  u8 table[6];
  u16 adcx;
  while (1)
  {  
  adcx=Read_ADC();
  table[0]=adcx/1000+48;
  table[1]='.';
  table[2]=adcx%1000/100+48;
  table[3]=adcx%1000%100/10+48;
  table[4]=adcx%1000%100%10+48;
  table[5]='v';
  Usart_SendString(table);
   //  LedBlink(2);
  }
}
NVIC.c
#include "stm32f10x.h"

void Nvic_Init(void)
{
//使能串口中断,并设置优先级
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//先占优先级2位从2位
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//USART1_IRQChannel_Priority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
ADC.C
#include "stm32f10x.h"
#include "uart.h"

void Adc_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO,ENABLE);
//PC1用作模拟量输入通道11
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);

ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1);
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_TempSensorVrefintCmd(ENABLE);//使能或使能温度传感器和内部参考电压通道
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//重置校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待校准完成
ADC_StartCalibration(ADC1);//开始校准
while(ADC_GetCalibrationStatus(ADC1));//获取指定的校准程序,直到校准完成
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能软件转换启动功能

}

//unsigned short int result;
u16 Read_ADC()
{
//[PC1]模拟通道11,采样序列号为1,采样时间71.5个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1,ADC_SampleTime_239Cycles5);
u16 result;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//启动转换
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=SET);
result=ADC_GetConversionValue(ADC1);
result=result*3300/4096;
return result;
}
USART.C
#include "stm32f10x.h"
#include "led.h"
void Uart1_Init(void)
{
//uart 的GPIO管脚初始化 PA9 usart1_TX PA10 USART_RX
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
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);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//只有串口1 使用72M,其他串口使用36M
USART_InitTypeDef USART_InitStructure;
//串口参数配置:115200,8,1,无奇偶校验,无硬流量控制 ,使能发送和接收
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// USART_ITConfig(USART1_IT_RXNE,ENABLE);//串口接收中断
USART_Cmd(USART1, ENABLE);
}
/*发送字符是通过查询字符串的状态来来不断的发送下一个数据。接受数据是通过中断来实现的,把接受的数据放入缓冲区,来实现。*/
//发送一个字符

void Usart_SendData(unsigned char x)
{
USART_SendData(USART1,x);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET);//查询发送数完成志位,等待发送完毕
}


//发送字符串
void Usart_SendString(unsigned char *Str)
{ while(*Str!='\0')
{
USART_SendData(USART1, *Str++); //(unsigned char)*Str++
Delay();
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}

//接收字符
unsigned int Usart_ReceiveData(void)
{
unsigned short int RxData;//16bit
// while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))
if(USART_GetITStatus(USART1,USART_FLAG_RXNE)==1)//查询接收寄存器是否非空
{
RxData = USART_ReceiveData(USART1);
}
return (RxData);
}
此模块以后会大量的涉及到,很有必要深入的研究,待相关工作忙完后再做更新。




关键词: STM32F103ZE     学习     笔记     #includ    

院士
2012-12-03 18:46:36     打赏
2楼
唉呀啊~~

这么多的源代码啊~~

高工
2012-12-03 18:57:12     打赏
3楼
看着是够费劲的,以后不这么玩了。。。嘿嘿

高工
2012-12-03 21:50:18     打赏
4楼
上位机呢?
程序直接打包上传的好

助工
2012-12-03 22:01:41     打赏
5楼

有没有这个的开发板,求指导,谢谢!


高工
2012-12-03 22:55:07     打赏
6楼
确实是个问题,下次直接打包

高工
2012-12-03 22:56:32     打赏
7楼

没有啊亲,找老大问问呗


助工
2012-12-04 19:33:37     打赏
8楼
好的,谢谢!

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]