新聞中心

        STM32之ADC

        作者: 時間:2016-11-26 來源:網絡 收藏

        ADC是多少位的?

        12位
        ADC有多少個?
        1個、2個或多至3個,視不同的器件而不同;每個又有多個通道。
        關于通道的名堂:
        10.3.3通道選擇
        有16個多路通道。可以把轉換分成兩組:規則的和注入的。在任意多個通道上以任意順序進行的一系列轉換構成成組轉換。例如,可以如下順序完成轉換:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。
        規則組由多達16個轉換組成。規則通道和它們的轉換順序在ADC_SQRx寄存器中選擇。規則組中轉換的總數寫入ADC_SQR1寄存器的L[3:0]位中。
        注入組由多達4個轉換組成。注入通道和它們的轉換順序在ADC_JSQR寄存器中選擇。注入組里的轉換總數目必須寫入ADC_JSQR寄存器的L[1:0]位中。
        它們有什么區別:
        不同的組轉換后保存數據的地方不一樣,產生的中斷標志不一樣。
        在掃描模式下,規則組會有能力把各通道數據通過DMA傳給SRAM,而注入組的數據總是存在在ADC_JDRx中。
        還有其他的一些區別,這里暫不一一羅列。
        ST為什么這么樣來設計AD轉換,肯定是有理由的,但是我不知道,因此,我也就難以深入地理解AD轉換的各種模式。這也就是說,對于知識的理解,要把它放在其應用背景中去學習才能學得好。因此,其他相關知識積累得越多,這里學起來也就越快,這也就是所謂的“功底”問題。某人功底深厚,意味著他見多識廣,遇到的事情多,能夠很快找到處理某件事情的“原型”。當然,也有一些人抽象學習能力極強,就算找不到“原型”,他也能學得很好。基本上,這類人的科學素養更高一些,在工程師、工科類學生中并不多見。
        閑話少說,下面來看怎么樣來使用AD轉換器?
        以一段源程序為例分別來解讀,同時進一步理解STM32中有關符號的含義,相信以后再讀庫源程序,定能更上一層樓。
        為看得清楚一些,以下代碼用藍色表示,而在這段代碼的注釋中插入的一些代碼則用紅色表示。從數據手冊上摘錄下來的內容則用黃底來表示(本來數據手冊摘錄部分用貼圖是最好的,但是發表博文時貼圖太痛苦了,,,偷點懶)。
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        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 = 1;
        ADC_Init(ADC1, &ADC_InitStructure);
        通過前面一系列的設置,終于可以執行ADC_Init函數了。執行完了還不行,還要指定通道轉換順序,采樣時間等,接下繼續。
        ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);
        if (Rank < 7)//這個Rand就是第三個參數
        {
        tmpreg1 = ADCx->SQR3;
        tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1));
        SQR3的值如下:
        //#define SQR3_SQ_Set((uint32_t)0x0000001F)
        之所以用5去乘,看下圖中的表格:ADC_SQ3中SQ1~SQ6每個都是占5位。
        這下理解了:如果這個Rank是1,那么tmpreg2這個變量第[4:0]這5位將會是11111(即SQR3_SQ_Set的初始值:0x0000001f),如果Rank是2,那么tmpreg2這個變量的第[9:5]將會是11111,即tmpreg2將等于:0x000003e0,依此類推。
        tmpreg1 &= ~tmpreg2;
        tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1));
        tmpreg1 |= tmpreg2;
        ADCx->SQR3 = tmpreg1;
        }

        */
        第四個參數是采樣時間設定,代碼如下:
        tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel);
        tmpreg1 |= tmpreg2;
        ADCx->SMPR2 = tmpreg1;

        接下來還有兩件事要做,第一件是允許DMA傳輸
        ADC_DMACmd(ADC1, ENABLE);
        第二件是打開ADC1開始轉換。
        ADC_Cmd(ADC1, ENABLE);
        這兩件事情都不麻煩,所以就不再分析了。
        至此一次ADC轉換配置完畢。很麻煩......也許功能強大的副產品就是麻煩吧,沒有辦法。



        關鍵詞: STM32AD

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 铁岭市| 疏附县| 麻城市| 乐都县| 潼关县| 河源市| 松阳县| 独山县| 虎林市| 湖南省| 时尚| 前郭尔| 绥化市| 金坛市| 镶黄旗| 永济市| 白河县| 双鸭山市| 乌拉特中旗| 景洪市| 四川省| 利川市| 佛冈县| 额济纳旗| 襄城县| 武城县| 绵阳市| 昌乐县| 隆尧县| 漠河县| 金堂县| 河东区| 白银市| 紫云| 祁东县| 阿城市| 安远县| 田东县| 达孜县| 遂溪县| 县级市|