久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1757|回復(fù): 5
收起左側(cè)

STM32單片機(jī)TIM觸發(fā)ADC采樣

[復(fù)制鏈接]
ID:1095470 發(fā)表于 2023-10-20 11:43 | 顯示全部樓層 |閱讀模式
本人最近在學(xué)習(xí)使用TIM來觸發(fā)ADC采樣,使用的是TIM1_CC4事件來觸發(fā)ADC1通道4的采樣,TIM_CH4通道對應(yīng)的是PA11引腳,ADC1_CH4對應(yīng)的是PA4引腳,由變量DC_ADC來存儲ADC1通道4的采樣值。使用ST-Link進(jìn)行仿真,由示波器測量得到TIM1_CH4的輸出波形是50%占空比的方波,符合預(yù)期,說明TIM1的輸出信號(即ADC1的觸發(fā)信號)是沒有問題的。但是ADC1_DR寄存器存放的值一直是校準(zhǔn)完成后校準(zhǔn)因子的值,且程序一直運(yùn)行在主函數(shù)的等待EOC轉(zhuǎn)換完成標(biāo)志循環(huán)內(nèi),說明ADC1并沒有被觸發(fā),求高人指點(diǎn)這是哪里出了問題,萬分感謝!
程序如下:
#include "main.h"
uint32_t DC_ADC = 0;

void MyGPIO_Init(void)
{
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);  //開啟GPIO時鐘
        
        GPIO_InitTypeDef GPIO_InitStruct1;
        GPIO_InitTypeDef GPIO_InitStruct2;
        
        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_AN;                        //設(shè)置PA4為模擬輸入
        GPIO_InitStruct1.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStruct1.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStruct1);
        
        GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_AF;                        //設(shè)置PA11為復(fù)用功能
        GPIO_InitStruct2.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStruct2.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct2.GPIO_OType = GPIO_OType_PP;                       //設(shè)置輸出為推挽輸出
        GPIO_InitStruct2.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
        GPIO_Init(GPIOA,&GPIO_InitStruct2);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_2);    //PC6設(shè)置為復(fù)用功能AF2(TIM1)
}

void MyADC1_Init(void)
{
        /*==================1.開啟ADC1時鐘===============*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);


        
        /*==================2.復(fù)位ADC1===============*/
        ADC_DeInit(ADC1)


        
        /*==================3.ADC1初始化===============*/
        ADC_InitTypeDef ADC_InitStruct;
        ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b ;                                           //分辨率12位
        ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC4;                    //外部觸發(fā)源為TIM1_CC4
        ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;                                             //不開啟連續(xù)轉(zhuǎn)換模式
        ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Upward;                             //向前掃描
        ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;        //外部觸發(fā)為上升沿
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;                                            //數(shù)據(jù)對齊模式:右對齊
        ADC_Init(ADC1,&ADC_InitStruct);
        
        ADC_ChannelConfig(ADC1,ADC_Channel_4,ADC_SampleTime_239_5Cycles);               //設(shè)置通道4和采樣周期


        
        /*==================4.校準(zhǔn)并使能ADC1===============*/
        ADC_GetCalibrationFactor(ADC1);                                                  //ADC打開校準(zhǔn)并等待完成
        ADC_Cmd(ADC1, ENABLE);                                                               //開啟ADC
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));                           //等待ADC準(zhǔn)備完成
}

void MyTIM1_Init(uint16_t arr,uint16_t psc)
{
        /*==============1.打開TIM1時鐘=============*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);


        
        /*==============2.初始化TIM1=============*/
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;    //向上計(jì)數(shù)
        TIM_TimeBaseInitStruct.TIM_Period = arr - 1;
        TIM_TimeBaseInitStruct.TIM_Prescaler = psc -1 ;
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);


        
        /*==============3.配置TIM1 PWM1模式=============*/
        TIM_OCInitTypeDef TIM_OCInitStruct;
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;                        //設(shè)置輸出模式:PWM1模式
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;                //設(shè)置比較輸出使能:
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;                        //設(shè)置ref為有效電平時 輸出高電平
        TIM_OCInitStruct.TIM_Pulse = arr/2;                                                        //輸出占空比:50%的PWM波
        TIM_OC4Init(TIM1,&TIM_OCInitStruct);                                                //通道4輸出


        
        TIM_CtrlPWMOutputs(TIM1,ENABLE);                   //PWM輸出使能
        
        TIM_Cmd(TIM1,ENABLE);                              //使能定時器 輸出上升沿時觸發(fā)ADC采樣



int main()
{
        MyGPIO_Init();
        MyADC1_Init();
        MyTIM1_Init(10000,8);
        while(1)
        {
                while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET) ;     //等待轉(zhuǎn)換完成標(biāo)志
                DC_ADC = ADC_GetConversionValue(ADC1)*3300/0xfff ;            //由ADC采樣轉(zhuǎn)換值計(jì)算出真實(shí)電壓
        }
        
}

回復(fù)

使用道具 舉報

ID:891041 發(fā)表于 2023-10-20 22:07 | 顯示全部樓層
EXTTRIG 寄存器沒配置這一位
回復(fù)

使用道具 舉報

ID:526543 發(fā)表于 2023-10-22 16:51 | 顯示全部樓層
ADC配置問題 ADC校準(zhǔn)問題 TIM1配置問題 GPIO配置問題 時鐘配置 錯誤檢查這些好好查查
回復(fù)

使用道具 舉報

ID:1095470 發(fā)表于 2023-10-23 11:23 | 顯示全部樓層
abob 發(fā)表于 2023-10-20 22:07
EXTTRIG 寄存器沒配置這一位

謝謝你的解答!我查了一下你說的EXTTRIG,F(xiàn)103的板子開啟外部觸發(fā)確實(shí)是需要將CR2寄存器的EXTTRIG置1。但是我使用的是F070的板子,找遍了ADC的寄存器也沒有發(fā)現(xiàn)外部觸發(fā)的開關(guān)控制,CFGR寄存器有個EXTEN可以選擇四種設(shè)置:關(guān)閉硬件觸發(fā)檢測(可由軟件啟動轉(zhuǎn)換),以及在上升沿、下降沿和上升下降沿進(jìn)行硬件觸發(fā)檢測。類似于F103和F070的這種區(qū)別還有ADC通道的掃描,F(xiàn)103的ADC是可以選擇通道掃描開啟和關(guān)閉的,而F070的只能選擇掃描方向,默認(rèn)就是開啟的。
回復(fù)

使用道具 舉報

ID:1095470 發(fā)表于 2023-10-23 11:43 | 顯示全部樓層
123456ZXC1 發(fā)表于 2023-10-22 16:51
ADC配置問題 ADC校準(zhǔn)問題 TIM1配置問題 GPIO配置問題 時鐘配置 錯誤檢查這些好好查查

都查過了,TIM可以輸出預(yù)期的波形,TIM配置應(yīng)該沒有問題,通過逐步調(diào)試感覺應(yīng)該是ADC觸發(fā)的問題,大佬幫忙看看我的觸發(fā)配置對不對
回復(fù)

使用道具 舉報

ID:1095470 發(fā)表于 2023-10-25 09:20 | 顯示全部樓層
已解決。
個人理解:ADC的外部觸發(fā)(包括TIM的Update和CCx事件)也是需要操作ADC_CR寄存器的開始轉(zhuǎn)換命令A(yù)DSTART位來實(shí)現(xiàn)的,是通過軟件層面進(jìn)行開始轉(zhuǎn)換的控制,而不是在硬件層面直接通過內(nèi)部邏輯電路觸發(fā)。
解決方法:
在main函數(shù)的 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET) ;     //等待轉(zhuǎn)換完成標(biāo)志
這一行前面加上ADC_StartOfConversion(ADC1);     //開啟ADC_CR寄存器的ADSTART位,即開始轉(zhuǎn)換命令
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本成人在线观看网站 | 日韩av成人在线观看 | 久久久久九九九女人毛片 | 激情毛片 | 毛片免费在线 | 国产一级片一区二区 | 日本人做爰大片免费观看一老师 | a毛片| 国产高清视频在线播放 | 国产精品网址 | 91精品国产色综合久久不卡98口 | 神马久久久久久久久久 | 福利视频三区 | 成人午夜精品 | 久久国产精品首页 | 久久se精品一区精品二区 | 精品一区二区三区四区五区 | 亚洲成人av一区二区 | 午夜视频免费 | 国产一区二区三区免费 | 在线日韩福利 | 日日夜夜精品 | 国产三级日本三级 | 亚洲一二三区在线观看 | 一区二区免费看 | 国产精品一区二区日韩 | 美女久久视频 | av中文字幕在线观看 | 久久久久国产精品午夜一区 | 最新国产福利在线 | 日韩成人在线观看 | 久久精品黄色 | 成人影院在线观看 | 91精品久久久久久久久 | 亚洲精品在线看 | 久久亚洲国产精品 | 午夜精品视频在线观看 | 久久精品在线免费视频 | 在线播放一区 | 国产视频三区 | 欧美videosex性极品hd |