OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4386|回复: 16

ADC采集到的值通过串口发送出去,但发送数据时数据不太正常,大家帮忙看看,谢谢了,急急急!!!

[复制链接]

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
发表于 2016-11-1 11:12:58 | 显示全部楼层 |阅读模式
5金钱
ADC采集到的值通过串口发送出去,但发送数据时数据不太正常,我想把采集到的16位数拆分成两个8位通过串口发送出去,测3.3V时输出对应的值应该是4096,结果不对,大家帮忙看看,谢谢了,急急急!!!

int main(void)
{
        u16 adcx;
        u8 dataH,dataL;
        My_USART1_Init();   //初始化串口1
        delay_init(100);    //初始化延时函数
        Adc_Init();         //初始化ADC
        while(1)
        {
                adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
                 adcx=adcx&0xfff;   //清高四位
                dataH = (adcx >> 8) & 0xff;  //取
                USART_SendData(USART1, dataH);//发送高8位
                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
                 {} //等待发送数据寄存器为
                         
                        //delay_ms(20);         
                         
                 dataL = adcx & 0xff ;  //低8位
                USART_SendData(USART1, dataL);//发送低8位
                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
                 {} //等待发送数据寄存器为
                         
                delay_ms(20);       
        }
}



最佳答案

查看完整内容[请看2#楼]

3.3V应该对应 0F FF,1.65V应该对应07 FF 或者接近,不是0F 8F
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 11:12:59 | 显示全部楼层
本帖最后由 库库03 于 2016-11-2 11:35 编辑
xuyaqi 发表于 2016-11-2 10:49
根据你提供的3.3v是0F B4 0F A6,0V是00 02 00 04,1.65V是0F 8F  0F 8A正常,0F C1离谱是否有接触不良等 ...
3.3V应该对应 0F FF,1.65V应该对应07 FF 或者接近,不是0F 8F
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 11:16:28 | 显示全部楼层
ADC和串口的程序都没问题,发送时数据拆分是不是有问题啊??
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10579
金钱
10579
注册时间
2014-6-12
在线时间
1023 小时
发表于 2016-11-1 11:28:55 | 显示全部楼层
具体说说发的什么,收的什么
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 11:51:06 | 显示全部楼层
xuyaqi 发表于 2016-11-1 11:28
具体说说发的什么,收的什么

采的3.3V,发的0F B4 0F A6等,算下来也差不多;采0V时基本也都是00 02 00 04都还行,但采1.65V时和采3.3V时,数据基本一样
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 12:07:37 | 显示全部楼层
用原子哥的程序
float temp;
temp=(float)adcx*(3.3/4096);  
adcx=temp;
USART_SendData(USART1, adcx);
这样发送
收到的是一下数据,感觉是好的
电压  串口显示
3.3v    34   (52)
1.65    1A  (26)
0.85    0D  (13)



回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10579
金钱
10579
注册时间
2014-6-12
在线时间
1023 小时
发表于 2016-11-1 15:56:00 | 显示全部楼层
库库03 发表于 2016-11-1 11:51
采的3.3V,发的0F B4 0F A6等,算下来也差不多;采0V时基本也都是00 02 00 04都还行,但采1.65V时和采3.3 ...

把采集1.65V时的电路与具体数值发一下
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 16:18:51 | 显示全部楼层
xuyaqi 发表于 2016-11-1 15:56
把采集1.65V时的电路与具体数值发一下

1.65v是3.3v分压得到的
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 16:21:04 | 显示全部楼层
xuyaqi 发表于 2016-11-1 15:56
把采集1.65V时的电路与具体数值发一下

值为0F 8F  0F 8A   0F C1等
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 16:23:45 | 显示全部楼层
下面是ADC的程序

//初始化ADC                                                                                                                          
void  Adc_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

  //先初始化ADC1通道5 IO口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  

        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1复位
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //复位结束         

       
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=100/4=25Mhz,ADC时钟最好不要超过36Mhz
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
       
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式       
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐       
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
       

        ADC_Cmd(ADC1, ENABLE);//开启AD转换器       

}                                  
//获得ADC值
//ch: @ref ADC_channels
//通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16
//返回值:转换结果
u16 Get_Adc(u8 ch)   
{
                  //设置指定ADC的规则组通道,一个序列,采样时间
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );        //ADC1,ADC通道,480个周期,提高采样时间可以提高精确度                            
  
        ADC_SoftwareStartConv(ADC1);                //使能指定的ADC1的软件转换启动功能       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
}
//获取通道ch的转换值,取times次,然后平均
//ch:通道编号
//times:获取次数
//返回值:通道ch的times次转换结果平均值
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;
}
       
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 16:33:28 | 显示全部楼层
串口程序测试过了,没什么问题,ADC是用原子哥的程序,也没问题,串口数据和预想的不一样,好郁闷,求高手指点
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2016-11-1 16:35:25 | 显示全部楼层
AD校准下试试
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 17:05:52 | 显示全部楼层

应该和校准没关系
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-11-1 18:57:53 | 显示全部楼层
看代码没问题。
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-8-21
在线时间
20 小时
 楼主| 发表于 2016-11-1 19:27:19 来自手机 | 显示全部楼层
正点原子 发表于 2016-11-1 18:57
看代码没问题。

原子哥,用你的程序
float temp;
temp=(float)adcx*(3.3/4096);  
adcx=temp;
USART_SendData(USART1, adcx);
采集3.3V串口是不是应该显示FF FF或者FE等接近的数?

回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10579
金钱
10579
注册时间
2014-6-12
在线时间
1023 小时
发表于 2016-11-2 10:49:08 | 显示全部楼层
库库03 发表于 2016-11-1 16:21
值为0F 8F  0F 8A   0F C1等

根据你提供的3.3v是0F B4 0F A6,0V是00 02 00 04,1.65V是0F 8F  0F 8A正常,0F C1离谱是否有接触不良等硬件问题。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2016-10-26
在线时间
7 小时
发表于 2016-11-10 21:46:21 | 显示全部楼层
我也差不多是这问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-1 10:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表