采用STM32F103硬件ADC功能进行光照强度采集

发布时间:2023-09-07  

硬件配置


单片机型号:STM32F103C8

屏幕:0.96寸OLED

传感器:光照传感器(ADC采集)

1b3c2042b9828b4e3dac51b9f4405099_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center.jpg

4ebcc3ddd32227bc349aaad1563affd5_poYBAGKVjAqASijEAAsNlF_HczA081.png

功能实现

光照强度采集ADC方式采集,STM32F103本身自带有硬件ADC功能。将采集到的数据实时刷新到屏幕上即可完成波形显示。

0.96寸OLED分辨率为128*64(128列,64行)。我们可以定义一个数组buff[128],数组下标作为横坐标,数组中的值作为纵坐标。这样即可把采集到的值实时刷新即可。由于需要先采集的数据先显示,这样就可以采用环形队列特性实现波形显示。


watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_centerpoYBAGKVjAqASijEAAsNlF_HczA081.png

功能实现:


int main()

{

    u8 cnt=40;

    u8 buff[20];

Beep_Init();//蜂鸣器初始化

Usartx_Init(USART1,115200,72);

TIMx_Init(TIM2,72,20000);//通过定时器2辅助串口接收数据,20ms

OLED_Init();//OLED初始化

    OLED_Display_Font(8,0,16,5);//光

    OLED_Display_Font(8+16,0,16,6);//照

    OLED_Display_Font(8+16*2,0,16,7);//强

    OLED_Display_Font(8+16*3,0,16,8);//度

    OLED_Refresh_PageGram();

    ADC1_InjectionChannel_Init();

    printf("串口初始化完成rn");

while(1)

{

ADC1->CR2|=1<<21;//开启注入通道转换

Delay_Ms(1);

while(adc.adc_len)

{

OLED_RowGram_Clear(adc.r);

OLED_DrawPoint(adc.r,adc.buff[adc.r],1);

adc.r=(adc.r+1)%ADC_LEN;

adc.adc_len--;//缓冲区长度-1

}

OLED_RefreshGram();//更新数据到屏幕

cnt++;

if(cnt>=40)

{

cnt=0;

snprintf((char *)buff,20,"%d",ADC_Data);

OLED_Display_str(16+16*4,0,16,buff);//显示光照值

OLED_Display_Font(8,0,16,5);

OLED_Display_Font(8+16,0,16,6);

OLED_Display_Font(8+16*2,0,16,7);

OLED_Display_Font(8+16*3,0,16,8);

OLED_Refresh_PageGram();//更新数据到屏幕

}

}

}

硬件ADC配置:


#include "adc.h"

/********************注入通道配置********************/

void ADC1_InjectionChannel_Init(void)

{

//1.开时钟

RCC->APB2ENR|=1<<9;//ADC1时钟

RCC->APB2ENR|=1<<3;//PB0时钟

RCC->APB2RSTR|=1<<9;//ADC复位时钟

RCC->APB2RSTR&=~(1<<9);//关复位

/*2.GPIO配置*/

GPIOB->CRL&=0xFFFFFFF0;//模式输入方式

/*3.ADC时钟频率配置*/

RCC->CFGR&=~(0x3<<14);//清除原来配置

RCC->CFGR|=0x2<<14;//ADC工作频率72MHZ/6=12MZH

/*4.配置ADC核心寄存器*/

// ADC1->CR1&=~(0xF<<16);//独立模式

ADC1->CR1|=1<<8;//扫描模式

ADC1->CR2|=1<<23;//启动温度传感器(测量CPU温度)

ADC1->CR2|=1<<15;//注入通道外部触发转换模式

ADC1->CR2|=0x7<<12;//注入通道事件方式启动转换

// ADC1->CR2&=~(1<<11);//右对齐(地位对齐,高位补0)

ADC1->SMPR1|=0x7<<18;//温度传感器采样时间通道16

ADC1->SMPR2|=0x2<<24;//通道8采用时间

// ADC1->CR2&=~(1<<1);//单次转换模式

ADC1->JSQR|=0x1<<20;//注入通道转换序列的通道数为2

/*设置要转换通道*/

ADC1->JSQR&=~(0x1F<<15);//清除原来寄存器中值

ADC1->JSQR|=(8<<15);

ADC1->JSQR&=~(0x1F<<10);//清除第三个注入序列中的值

ADC1->JSQR|=(16<<10);

/*开中断*/

ADC1->CR1|=1<<7;//开启注入通道中断

STM32_NVIC_SetPriority(ADC1_2_IRQn,1,1);//设置优先级

ADC1->CR2|=1<<0;//开启ADC

ADC1->CR2|=1<<3;//初始化校准

while(ADC1->CR2&1<<3);//等待初始化校准完成

ADC1->CR2|=1<<2;//开始校准

while(ADC1->CR2&1<<2){}//等待校准完成

}

/************ADC中断服务函数*******************/

u16 ADC_Data=0;

ADC_DATA adc;//获取的光照强度结构体数据

void ADC1_2_IRQHandler(void)

{

u16 data;

if(ADC1->SR&1<<2)//注如通道转完成标志

{

        ADC_Data=ADC1->JDR2;

        data=10+ADC_Data*(64.0/4095.0);

        if(data>63)data=63;//保证ADC采集的值为10~63,保证和屏幕高度一致

        adc.buff[adc.w]=data;//写入数据到缓冲区

        adc.w=(adc.w+1)%ADC_LEN;

        adc.adc_len++; 

}

ADC1->SR=0;

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>