实验内容:单通道规则采样,将采到的电压经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);
}
此模块以后会大量的涉及到,很有必要深入的研究,待相关工作忙完后再做更新。
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |