stm32用两路adc

stm32用两路adc,第1张

#define Channel_Num 2

#define Sample_Num 10

vu16 ADC_ConvertedValue[Sample_Num][Channel_Num]

void ADC_DMA_Config(void)

{

DMA_InitTypeDef DMA_InitStructure

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE)

DMA_DeInit(DMA1_Channel1)

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC

DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num

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_InitStructure.DMA_M2M = DMA_M2M_Disable

DMA_Init(DMA1_Channel1, &DMA_InitStructure)

DMA_Cmd(DMA1_Channel1,ENABLE)

}

void ADC1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure

ADC_InitTypeDef ADC_InitStructure

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN

GPIO_Init(GPIOA, &GPIO_InitStructure)

ADC_DMA_Config()

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE)

// ADC_DeInit(ADC1)

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent//搭悔ADC1和ADC2工作在独立模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE//多通道

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE//连续转换

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None//软件启动转换

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right//转换结果右对齐

ADC_InitStructure.ADC_NbrOfChannel = Channel_Num//通道数目

ADC_Init(ADC1, &ADC_InitStructure)

// ADC_TempSensorVrefintCmd(ENABLE)//使能片内温度传感器兄或

RCC_ADCCLKConfig(RCC_PCLK2_Div6) //PCLK 6分频

//通道,转换次序,转换时间

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5)

ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5)

ADC_DMACmd(ADC1, ENABLE)

ADC_Cmd(ADC1, ENABLE)

ADC_ResetCalibration(ADC1)

while(ADC_GetResetCalibrationStatus(ADC1))

ADC_StartCalibration(ADC1)//开始校准

while(ADC_GetCalibrationStatus(ADC1))

ADC_SoftwareStartConvCmd(ADC1, ENABLE)//使能ADC的软件转换启动功能

}

uint16_t ReadADCAverageValue(uint16_t Channel)

{

uint8_t i

uint32_t sum = 0

for(i=0i<Sample_Numi++)

{

sum+=ADC_ConvertedValue[i][Channel]

}

return (sum/Sample_Num)

}

楼主你好

1602的程序可以给你,但是ADC还得看具体芯片的,不同的芯片的精度、管脚定义、时序不一样,程序也不一样,你可以结合具体芯片型号自己写,很简单的,下面是用51写得一个1602的程序,液隐凯晶显示0123456789和ABCDEDGHIG,你结合实际需要改动一下就行了:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

//这三个引脚参考资料

sbit E=P2^7 //1602使能引脚

sbit RW=P2^6 //1602读写引脚

sbit RS=P2^5 //1602数据/命令选择引脚

/********************************************************************

* 名称 : delay()

* 功能 : 延时,延时时间大概为140US。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay()

{

int i,j

for(i=0i<=100i++)

for(j=0j<=20j++)

}

/********************************************************************

* 名称 : enable(uchar del)

* 功能 : 1602命令函数

* 输入闷携源 : 输入的命令值

* 输出 : 无

***********************************************************************/

void enable(uchar del)

{

P0 = del

RS = 0

RW = 0

E = 0

delay()

E = 1

delay()

}

/********************************************************************

* 名称 : write(uchar del)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void write(uchar del)

{

P0 = del

RS = 1

RW = 0

E = 0

delay()

E = 1

delay()

}

/********************************************************************

* 名称 : L1602_init()

* 功能 : 1602初始化,请参考1602的资料

* 输入 : 无

* 输出 : 无

***********************************************************************/

void L1602_init(void)

{

enable(0x01)

enable(0x38)

enable(0x0c)

enable(0x06)

enable(0xd0)

}

/********************************************************************

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让蚂态第一行,第五个字符显示"b" ,调用该函数如下

L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_char(uchar hang,uchar lie,char sign)

{

uchar a

if(hang == 1) a = 0x80

if(hang == 2) a = 0xc0

a = a + lie - 1

enable(a)

write(sign)

}

/********************************************************************

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_string(uchar hang,uchar lie,uchar *p)

{

uchar a

if(hang == 1) a = 0x80

if(hang == 2) a = 0xc0

a = a + lie - 1

enable(a)

while(1)

{

if(*p == '\0') break

write(*p)

p++

}

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Main()

{

uchar i = 48

L1602_init()

L1602_char(1,5,'b')

L1602_string(1,1," 0123456789 ")

L1602_string(2,1," ABCDEDGHIJ ")

while(1)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12553821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存