zoukankan      html  css  js  c++  java
  • 【AT91SAM3S】ADC中断方式采集数据

    板子依旧是英倍特的EK-SAM3S。ADC部分的原理图如下:

    image

    PB1是一个复用引脚,在这里被用作AD功能,对应芯片上的AD5。即,使用片内ADC的5通道测VR1上2号引脚的电压。

    实验采用了SysTick定时器产生中断方式来采集ADC数据。SysTick中断发生时,开启ADC转换。ADC转换结束时,产生中断,在ADC中断处理函数中读取ADC采集到的数据。转换后,通过UART输出,到PC端显示。

    SysTick和ADC的中断处理函数如下:

    uint32_t time_stamp = 0;
    WEAK void SysTick_Handler( void )
    {
            uint32_t status;
        time_stamp++;
        /* simply to get 1s interval*/
        if (time_stamp % 1000 == 0)  //1秒采集一次ADC数据
        {
            status = ADC_GetStatus( ADC ) ;

            /* if conversion is done*/
            if ( (status & ADC_ISR_EOC5) == ADC_ISR_EOC5 )
            {
                ADC_StartConversion( ADC ) ;//开启ADC转换
            }
        }
    }

    /**
    * rief Default SUPC interrupt handler for ADC.
    */

    WEAK void ADC_IrqHandler( void )
    {
        uint32_t status;

        status = ADC_GetStatus(ADC);

        if ( (status & ADC_ISR_RXBUFF) == ADC_ISR_RXBUFF )
        {
            conversionDone = 1;  //设置转换完成标志

            ADC_ReadBuffer( ADC, adc_values, 1 ) ;

        }
    }

    主函数:

    int main()
    {
        int i;
       
        WDT_Disable(WDT);
        SysTick_Config(BOARD_MCK / 1000);  //配置SysTick 
        ADC_Initialize(ADC,ID_ADC);  //初始化ADC
       
        ADC_cfgFrequency(ADC,15,4);
        ADC_check(ADC,BOARD_MCK);
        ADC_EnableChannel(ADC,ADC_CHANNEL_5);   //使能5号通道  PB1
       
        NVIC_EnableIRQ(ADC_IRQn);  //使能ADC中断
       
        ADC_StartConversion(ADC); 
        ADC_ReadBuffer(ADC,adc_values,BUFFER_SIZE);
        ADC_EnableIt(ADC,ADC_IER_RXBUFF);
        while(1)
        {
            while(!conversionDone);//等待转换完成标志
            if ( conversionDone )
            {
                for ( i = 0 ; i < BUFFER_SIZE ; i++ )
                {
                    printf( "Vol:%d mv ", (adc_values[i] * 3300 /4095) ) ;  //通过串口输出电压值
                }
                conversionDone = 0 ;
            }
        }
    }

    连上串口线,PC端会看到一些电压数据发过来。转动变阻器,可以看到电压值会不断地变化,变阻器转到底,辉县市0mv和3300mv。说明咱们测量的还凑合了。

    image

  • 相关阅读:
    iOS 开发中保留小数问题
    SQLite基础回顾
    Git配置技巧及常用命令总结
    iOS开发之Runtime使用
    控制器View的加载和内存警告流程图
    Java工作流系统-驰骋BPM工作流 引擎的工作模式
    java工作流系统-流程引擎执行自定义URL
    CCBPM工作流系统中如何在特定的一个步骤,调用起另外一条流程
    Java工作流引擎jflow对流程的结束大总结
    .net工作流引擎ccflow开发平台属性功能的隐藏显示介绍
  • 原文地址:https://www.cnblogs.com/zyqgold/p/3330763.html
Copyright © 2011-2022 走看看