OpenEdv-开源电子网

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

adc采集会影响串口通讯吗

[复制链接]

14

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-12-28
在线时间
51 小时
发表于 2016-9-6 11:00:47 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 新手驾到 于 2016-9-6 11:43 编辑

用stm32 A采集两路adc(霍尔摇杆),通过串口传递给另一个stm32 B,然后B借助串口调试工具打印在pc上。当霍尔摇杆不动,采集的adc不变化时候,pc上打印的数据正常,但是拨动摇杆adc采集数据变化时候pc上打印的串口数据就会变动、错位(第一个数据在第二个位置上打印出来,第二个在第三个位置上打印。。)。单独测试过adc采集,不会出现这样的情况,而且打印串口数据出错时候出现延时(单独测试adc不会有),原子哥,各位大神帮忙看看是个什么问题。图中后面两个数据为adc采样的数据24,25,前面两个数据100,2放着用于对比

代码都是用历程中的,然后修改对应的管脚等参数
以下是adc采集发送的代码:
int main(void)
{         
               float adcx1,adcx2;
                u8 flag=100,speed=2;
                delay_init();         
                NVIC_Configuration();         
                 LED_Init();               
                uart1_init(9600);        
                Adc_Init();

         while(1)
         {
                  adcx1=Get_Adc_Average(ADC_Channel_6,10)*50/4096.0;
                  adcx2=Get_Adc_Average(ADC_Channel_7,10)*50/4096.0;
                 
  //                      printf("***%f   %f   \r\n",adcx1,adcx2);
                        delay_ms(5);                   USART_SendData(USART1,flag);
                        delay_ms(5);
                   USART_SendData(USART1,speed);
                        delay_ms(5);
                  USART_SendData(USART1,adcx1);
                  delay_ms(5);
                  USART_SendData(USART1,adcx2);

       }

void  Adc_Init(void)
{         
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB  |RCC_APB2Periph_ADC1, ENABLE );          //adc1时钟使能
         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置分频
        //PA6,PA7设置为模拟通道                     
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        ADC_DeInit(ADC1);  

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        
        ADC_InitStructure.ADC_NbrOfChannel = 1;        
        ADC_Init(ADC1, &ADC_InitStructure);        

          ADC_Cmd(ADC1, ENABLE);        
        ADC_ResetCalibration(ADC1);                 
        while(ADC_GetResetCalibrationStatus(ADC1));        
        ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1));
}                                 

u16 Get_Adc(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_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;
}         

void uart1_init(u32 bound){
                GPIO_InitTypeDef GPIO_InitStructure;
                USART_InitTypeDef USART_InitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        
                USART_DeInit(USART1);
         //USART2_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
    GPIO_Init(GPIOA, &GPIO_InitStructure);
       //USART2_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;               
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               
                NVIC_Init(&NVIC_InitStructure);        

                USART_InitStructure.USART_BaudRate = bound;
                USART_InitStructure.USART_WordLength = USART_WordLength_8b;
                USART_InitStructure.USART_StopBits = USART_StopBits_1;
                USART_InitStructure.USART_Parity = USART_Parity_No;
                USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
                USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE);     
}

个人觉得应该是时序的问题,            
USART_SendData(USART1,flag);
delay_ms(5);   
在发送数据时候设定不同的延时时间5ms,8ms,会出现不同的数据错位情况。







正常情况

正常情况

拨动摇杆数据错位情况

拨动摇杆数据错位情况
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-9-6 11:07:08 | 显示全部楼层

首先看硬件方面有没有关联,
其次,直接观察AD的值。有可能AD没错,但后面数据管理出错,造成这现象。
要学会把物理过程分解开。



回复

使用道具 举报

14

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-12-28
在线时间
51 小时
 楼主| 发表于 2016-9-6 11:40:48 | 显示全部楼层
xuande 发表于 2016-9-6 11:07
首先看硬件方面有没有关联,
其次,直接观察AD的值。有可能AD没错,但后面数据管理出错,造成这现象。
...

硬件如果有问题,adc采样不会成功,两块板子没有链接好,通讯不会成功。
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-6 13:09:21 | 显示全部楼层
USART_SendData(USART1,adcx2);后面也加一个delay呢 ?
自在随心
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 19:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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