8路灰度传感器与stm32f1

目录

1.连接

2.adc配置

3.主函数


1.连接

2.adc配置

 #include "adc.h"
 #include "delay.h"

	   	   
//初始化ADC
void  Adc_Init(void)
{ 	
    /*定义两个初始化要用的结构体,下面给每个结构体成员赋值*/
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*
	  使能GPIOA和ADC1通道时钟
	  注意:除了RCC_APB2PeriphClockCmd还有RCC_APB1PeriphClockCmd,那么该如何选择?
      APB2:高速时钟,最高72MHz,主要负责AD输入,I/O,串口1,高级定时器TIM
      APB1:低速时钟,最高36MHz,主要负责DA输出,串口2、3、4、5,普通定时器TIM,USB,IIC,CAN,SPI
  	*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );	  
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);  //72M/6=12, ADC的采样时钟最快14MHz  
      
    /*配置输入电压所用的PA0引脚*/         

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	ADC_DeInit(ADC1); //复位,将ADC1相关的寄存器设为默认值
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//工作模式:ADC1和ADC2独立工作模式  (还有其他什么模式?请看下面的附录图2)
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//数模转换工作:扫描(多通道)模式=ENABLE、单次(单通道)模式=DISABLE
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//数模转换工作:连续=ENABLE、单次=DISABLE
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//ADC转换由软件触发启动 (还有其他什么模式?请看下面的附录图3)
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐   除了右就是左:ADC_DataAlign_Left
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目   范围是1-16
	ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADC1的寄存器
 
    
	 ADC_RegularChannelConfig(ADC1, ADC_Channel_0|ADC_Channel_1|ADC_Channel_5|ADC_Channel_6|ADC_Channel_7|ADC_Channel_8|ADC_Channel_9, 1, ADC_SampleTime_239Cycles5 );//添加通道	  	
	 
	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC  注意:函数ADC_Cmd只能在其他ADC设置函数之后被调用

    /*下面4步按流程走,走完就行*/
	ADC_ResetCalibration(ADC1);	//重置指定的ADC的校准寄存器
	while(ADC_GetResetCalibrationStatus(ADC1)); //等待上一步操作完成
	ADC_StartCalibration(ADC1);	//开始指定ADC的校准状态	
	while(ADC_GetCalibrationStatus(ADC1));//等待上一步操作按成		
 }	


//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)// 
{
  	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期	  			    
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}

u16 Get_Adc_Average(u8 ch,u8 times)//电压平均值
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_ms(5);
	}
	return temp_val/times;
} 	 

3.主函数

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"	 
#include "adc.h"

   
 int main(void)
 {	 
	float tempa0,tempa1,tempa4,tempa5,tempa6,tempa7,tempb0,tempb1;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	LCD_Init();			 	
 	Adc_Init();		  		//ADC初始化
   
	while(1)
	{
		tempa0=(float)Get_Adc_Average(ADC_Channel_0,10)*(3.3/4096);
		tempa1=(float)Get_Adc_Average(ADC_Channel_1,10)*(3.3/4096);
		tempa4=(float)Get_Adc_Average(ADC_Channel_4,10)*(3.3/4096);
		tempa5=(float)Get_Adc_Average(ADC_Channel_5,10)*(3.3/4096);
		tempa6=(float)Get_Adc_Average(ADC_Channel_6,10)*(3.3/4096);
		tempa7=(float)Get_Adc_Average(ADC_Channel_7,10)*(3.3/4096);
		tempb0=(float)Get_Adc_Average(ADC_Channel_8,10)*(3.3/4096);
		tempb1=(float)Get_Adc_Average(ADC_Channel_9,10)*(3.3/4096);
		
		printf("v0 %-4f v1 %-4f v2 %-4f v3 %-4f v4 %-4f v5 %-4f v6 %-4f v7 %-4f\r\n",tempa0,tempa1,tempa4,tempa5,tempa6,tempa7,tempb0,tempb1);

		if(tempa0<3.15||tempa1<3.15||tempa4<3.15||tempa5<3.15||tempa6<3.15||tempa7<3.15||tempb0<3.15||tempb1<3.15)
		LED0=!LED0;
		delay_ms(1000);	
	}
 }

  • 24
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值