12c5a60s2单片机ADC采样程序详解(每一句话都是什么意思)

12c5a60s2单片机ADC采样程序详解(每一句话都是什么意思),第1张

ADC_CONTR&=0xF8; //打开ADC的电源,设置AD转换时间为90个时钟周期转换一次,

//启动AD转换

ADC_CONTR|=0x00; //这句没有设置作用,只是用作延时;

ADC_CONTR&=0xEF; //清空AD转换完成的标志位

ADC_CONTR|=0x08; //开始AD转换

while(!(ADC_CONTR&0x10)); //检测AD是否转换完成

val1=ADC_RES; //取10位AD转换结果的高两位数据

val1=val1<<8; //把数据向右移8位 ,为取AD低8位数据做处理

val1=val1|ADC_RESL; //取AD数据的低八位数据

ADC_CONTR &= !ADC_FLAG; //清空AD转换完成的标志位,以便下次转换做准备

方法1:将浮点数从小数点分开,分别向左、向右取两位数进行转换,在数据区里存贮,再取下一个两位,按顺序存贮,直到完成。如256345,第一次取值为56和34,第二次取值为5和50。最后转换的值是:05

34

22

32,共占用了4个字节。再使用时需要重新合成。只要有足够大的存贮区,就可以放置任意长度的数值。

方法2:设置2个4字节的数据块,分别放置小数的整数位和小数位,可以满足最大无符号十进制99999999的存放。

在你上面的程序中,因为16进制数是没小数点的,所以不能直接转换。

过置位ADC_CR1寄存器的 ADON位来开启ADC。当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置ADC_CR1寄存器的ADON 位。在转换结束时ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次的转换。

我的理解是这样的:

我不知道ADC_TEMP 是否已经被初始化为零了。如果是,思路就是这样 0000 0000 0000 0000 0000 0000 这是ADC_temp,AD_DATA 应该就是采样的 每一位 的数 比如采样你说的 101101,其实应该把前面的0补齐,也就是0000 0000 0000 0000 0010 1101 。然后经过for循环,从第一位开始取,当遇到1的时候,执行ADC_temp|= 1; 我们知道或运算的规则,1和什么都是1。所以就从第一位0开始取,直到取完最后一位,每取一位左移一位,再和输出的AD_DATA 或运算。前提是,这个AD_DATA是高位输出。

不用自己写程序,

用stm32f10x_adcc中的函数调用一下就可以了

提醒一下,在调用ADC_Init之前先把42脚配成AN功能。

然后用

AD_value = ADC_GetConversionValue(ADC1);就可以了。

给你一段参考的

ADC_InitStructureADC_Mode = ADC_Mode_Independent;

ADC_InitStructureADC_ScanConvMode = DISABLE;

ADC_InitStructureADC_ContinuousConvMode = ENABLE;

ADC_InitStructureADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructureADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructureADC_NbrOfChannel = 1;

ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);

/ Configure high and low analog watchdog thresholds /

ADC_AnalogWatchdogThresholdsConfig(ADC1, 0x0fff, 0x0000);

/ Configure channel8 as the single analog watchdog guarded channel /

ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_0);

/ Enable analog watchdog on one regular channel /

ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);

/ Enable ADC1 /

ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);

/ Check the end of ADC1 reset calibration register /

while(ADC_GetResetCalibrationStatus(ADC1));

/ Start ADC1 calibaration /

ADC_StartCalibration(ADC1);

/ Check the end of ADC1 calibration /

while(ADC_GetCalibrationStatus(ADC1));

/ Start ADC1 Software Conversion /

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

AD_value = ADC_GetConversionValue(ADC1);

#define ADCFrequency 1000000 / 转换时钟1MHz /

void ADCInit( void )//初始化

{

LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16); / 允许I/O配置模块的时钟 /

LPC_IOCON->PIO1_10 &= ~0xBF; / 配置PIO1_10为模拟输入模式 /

LPC_IOCON->PIO1_10 |= 0x01; / PIO1_10模拟输入通道6 /

LPC_IOCON->PIO1_11 &= ~0xBF; / 配置PIO1_1 为模拟输入模式 /

LPC_IOCON->PIO1_11 |= 0x01; / PIO1_1 模拟输入通道7 /

LPC_SYSCON->PDRUNCFG &= ~(0x01 << 4); / ADC模块上电 /

LPC_SYSCON->SYSAHBCLKCTRL |= (0x01 << 13); / 使能ADC模块时钟 /

LPC_ADC->CR = ( 0x01 << 6 ) | / SEL=6,选择ADC6 /

( 0x01 << 7 ) | / SEL=7,选择ADC7 /

(( SystemFrequency / ADCFrequency - 1 ) << 8 ) | / 转换时钟1MHz /

( 1 << 16 ) | / BURST=1,使用Burst模式 /

( 0 << 17 ) | / 使用11 clocks转换 /

( 0 << 24 ) | / ADC转换停止 /

( 0 << 27 ); / 直接启动ADC转换,此位无效 /

NVIC_EnableIRQ(ADC_IRQn); / 使能ADC中断,并配置优先级 /

NVIC_SetPriority(ADC_IRQn, 2);

LPC_ADC->INTEN = (1 << 6); / 通道6 中断使能 /

LPC_ADC->INTEN = (1 << 7); / 通道7 中断使能 /

}

void ADC_IRQHandler(void)//中断过程

{

bAdcFlag = 1;

Channel_1 = ( (LPC_ADC->DR[6]) >> 6) & 0x3FF;/ Channel_1 读取通道6的值/

Channel_2 = ( (LPC_ADC->DR[7]) >> 6) & 0x3FF;/ Channel_2 读取通道7的值/

}

INT16U sTreatmentADC(INT16U wAdcChannel)//处理过程

{

if(bAdcFlag == 1){

bAdcFlag = 0; / 清零标志/

}

以上就是关于12c5a60s2单片机ADC采样程序详解(每一句话都是什么意思)全部的内容,包括:12c5a60s2单片机ADC采样程序详解(每一句话都是什么意思)、带有ad模块的51单片机怎么读取ad数值、用CUBE库的ADC,怎么读取多通道的转换结果等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10212947.html

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

发表评论

登录后才能评论

评论列表(0条)

保存