初级会员

- 积分
- 61
- 金钱
- 61
- 注册时间
- 2019-11-21
- 在线时间
- 21 小时
|
1金钱
#include "adc.h"
#include "stm32f10x.h"
#include "delay.h"
u16 adc_buf[2];
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);//使能ADC1,GPIOA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA时钟
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_Init(GPIOA,&GPIO_InitStructure);
DMA_DeInit(DMA1_Channel1);
//DMA1的初始化结构体
DMA_InitStructure.DMA_PeripheralBaseAddr =((u32)ADC1+0x4c);//ADC1_BASE; //外设基地址,ADC的数据寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)adc_buf; //存储器地址,既我们在内部SRAM定义的一个数组地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2; //一次传输的数据量,我们这里是两个
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //不需要递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;// 外设数据大小为半字,即两个字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //存储器数据大小也为半字,跟外设数据大小相同
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//优先级高
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);//复位结束
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//不是扫描模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//是连续模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不是外部中断触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_NbrOfChannel=ADC_Channel_2;//两个通道
ADC_Init(ADC1,&ADC_InitStructure);//初始化
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_239Cycles5);
ADC_DMACmd(ADC1, ENABLE);// 使能ADC DMA
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
u16 Get_ADC_1(u8 ch)
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
u16 Get_ADC_1_VAL(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_ADC_1(ch);
delay_ms(5);
}
return temp_val/times;
}
#include "led.h"
#include "stm32f10x.h"
#include "delay.h"
#include "adc.h"
#include "beep.h"
#include "oled.h"
extern u16 adc_buf[2];
//float adc_bufmoni[3]= {0};
int main(void)
{
u16 temp;
u16 adcx;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init();
LED_Init();
BEEP_Init();
ADC1_Init();
OLED_Init(); //初始化OLED
OLED_ShowString(0,0,"LIGHT SEN1:",16);
OLED_ShowString(0,24, "LIGHT SEN2:",16);
OLED_ShowString(0,48,"LIGHT SEN3:",16);
// OLED_ShowString(0,52,"ASCII:",12);
// OLED_ShowString(64,52,"CODE:",12);
OLED_Refresh_Gram(); //更新显示到OLED
while(1)
{
adcx=Get_ADC_1_VAL(ADC_Channel_1,20);
//adcx=adc_buf[0];
OLED_ShowNum(97,0,adcx,3,16);
OLED_Refresh_Gram();
//LCD_ShowxNum(30+10*8,130,adcx,3,16,0);//显示ADC的值
if(adcx>20)
BEEP=!BEEP;
else BEEP=BEEP;
delay_ms(250);
//adcx=Get_ADC_1_VAL(ADC_Channel_3,20);
//temp=(float)adcx*(3.3/4096);
//adcx=temp;
//OLED_ShowNum(97,0,adcx,1,16);//显示电压值
//temp-=adcx;
//temp*=10;
//OLED_ShowNum(103,0,temp,1,16);
//OLED_ShowNum(97,0,adcx,3,16);
// OLED_Refresh_Gram();
//LCD_ShowxNum(30+10*8,130,adcx,3,16,0);//显示ADC的值
if(adcx>20)
BEEP=!BEEP;
else BEEP=BEEP;
delay_ms(250);
adcx=Get_ADC_1_VAL(ADC_Channel_2,20);
OLED_ShowNum(97,24,adcx,3,16);
OLED_Refresh_Gram();
//LCD_ShowxNum(30+10*8,130,adcx,3,16,0);//显示ADC的值
if(adcx>20)
BEEP=!BEEP;
else BEEP=BEEP;
delay_ms(250);
}
}
|
最佳答案
查看完整内容[请看2#楼]
1.这种问题删了屏幕代码 printf打印 功能越少错误越好检查
2.找个能用的对比吧http://www.openedv.com/forum.php?mod=viewthread&tid=273877&extra=
|