找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32單片機(jī)+proteus+adc采集電壓仿真顯示為零

[復(fù)制鏈接]
ID:875228 發(fā)表于 2023-4-2 15:57 | 顯示全部樓層 |閱讀模式
求助一下大佬!因?yàn)榘遄由系膐led不是ssd1306驅(qū)動(dòng)的所以現(xiàn)在只能學(xué)習(xí)跑仿真,在學(xué)adc采集電壓的實(shí)驗(yàn),OLED顯示沒問題,現(xiàn)在的問題是采集不到電壓,顯示總是0。。。麻煩好心人幫我看看是哪里出了問題。
軟件用的keil mdk5.24   proteus8.13 單片機(jī)是STM32F103C8
————————————————
1.仿真圖: 屏幕截圖 2023-04-02 124237.jpg


2.adc.c
  1. #include "adc.h"

  2. vu16 ADC_DMA_IN5; //ADC數(shù)值存放的變量


  3. void ADC_DMA_Init(void){ //DMA初始化設(shè)置
  4.         DMA_InitTypeDef DMA_InitStructure;//定義DMA初始化結(jié)構(gòu)體
  5.         DMA_DeInit(DMA1_Channel1);//復(fù)位DMA通道1
  6.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定義 DMA通道外設(shè)基地址=ADC1_DR_Address
  7.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN5; //定義DMA通道ADC數(shù)據(jù)存儲(chǔ)器(其他函數(shù)可直接讀此變量即是ADC值)
  8.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外設(shè)為源地址
  9.         DMA_InitStructure.DMA_BufferSize = 1;//定義DMA緩沖區(qū)大。ǜ鶕(jù)ADC采集通道數(shù)量修改)
  10.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//當(dāng)前外設(shè)寄存器地址不變
  11.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//當(dāng)前存儲(chǔ)器地址:Disable不變,Enable遞增(用于多通道采集)
  12.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定義外設(shè)數(shù)據(jù)寬度16位
  13.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定義存儲(chǔ)器數(shù)據(jù)寬度16位
  14.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位環(huán)形緩沖模式
  15.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道優(yōu)先級(jí)高
  16.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存儲(chǔ)器到存儲(chǔ)器傳輸
  17.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA通道1
  18.         DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
  19. }
  20. void ADC_GPIO_Init(void){ //GPIO初始化設(shè)置
  21.         GPIO_InitTypeDef  GPIO_InitStructure;         
  22.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);      
  23.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA時(shí)鐘(用于ADC的數(shù)據(jù)傳送)
  24.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1時(shí)鐘
  25.     GPIO_InitStructure.GPIO_Pin = ADC_CH5; //選擇端口                        
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //選擇IO接口工作方式為模擬輸入      
  27.         GPIO_Init(ADCPORT, &GPIO_InitStructure);                        
  28. }
  29. void ADC_Configuration(void){ //初始化設(shè)置
  30.         ADC_InitTypeDef ADC_InitStructure;//定義ADC初始化結(jié)構(gòu)體變量
  31.         ADC_GPIO_Init();//GPIO初始化設(shè)置
  32.         ADC_DMA_Init();//DMA初始化設(shè)置
  33.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在獨(dú)立模式
  34.         ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能掃描
  35.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC轉(zhuǎn)換工作在連續(xù)模式
  36.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有軟件控制轉(zhuǎn)換
  37.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//轉(zhuǎn)換數(shù)據(jù)右對(duì)齊
  38.         ADC_InitStructure.ADC_NbrOfChannel = 1;//順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目(根據(jù)ADC采集通道數(shù)量修改)
  39.         ADC_Init(ADC1, &ADC_InitStructure); //根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器
  40.         //設(shè)置指定ADC的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時(shí)間
  41.         //ADC1,ADC通道x,規(guī)則采樣順序值為y,采樣時(shí)間為28周期                 
  42.         ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_28Cycles5);//ADC1選擇信道x,采樣順序y,采樣時(shí)間n個(gè)周期

  43.         ADC_DMACmd(ADC1, ENABLE);// 開啟ADC的DMA支持(要實(shí)現(xiàn)DMA功能,還需獨(dú)立配置DMA通道等參數(shù))
  44.         ADC_Cmd(ADC1, ENABLE);//使能ADC1
  45.         ADC_ResetCalibration(ADC1); //重置ADC1校準(zhǔn)寄存器
  46.         while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)重置完成
  47.         ADC_StartCalibration(ADC1);//開始ADC1校準(zhǔn)
  48.         while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)完成
  49.         ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1軟件開始轉(zhuǎn)換
  50. }
復(fù)制代碼
3.adc.h
  1. #ifndef __ADC_H
  2. #define __ADC_H                           
  3. #include "sys.h"


  4. #define ADC1_DR_Address    ((uint32_t)0x4001244C) //ADC1這個(gè)外設(shè)的地址(查參考手冊得出)

  5. #define ADCPORT                GPIOA        //定義ADC接口
  6. #define ADC_CH4                GPIO_Pin_4        //定義ADC接口 電壓電位器
  7. #define ADC_CH5                GPIO_Pin_5        //定義ADC接口 光敏電阻
  8. #define ADC_CH6                GPIO_Pin_6        //定義ADC接口 搖桿X軸
  9. #define ADC_CH7                GPIO_Pin_7        //定義ADC接口 搖桿Y軸


  10. void ADC_DMA_Init(void);
  11. void ADC_GPIO_Init(void);
  12. void ADC_Configuration(void);

  13. #endif
復(fù)制代碼
4.main.c
  1. #include "stm32f10x.h"
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "oled.h"
  5. #include "adc.h"

  6. extern vu16 ADC_DMA_IN5;
  7. int main()
  8. {
  9.         delay_ms(500);
  10.         RCC_Configuration();//系統(tǒng)時(shí)鐘初始化
  11.         ADC_Configuration();//ADC初始化
  12.         OLED_Init();//OLED初始化
  13.         OLED_ColorTurn(0);//0正常顯示,1 反色顯示
  14.     OLED_DisplayTurn(0);//0正常顯示,1 屏幕翻轉(zhuǎn)顯示
  15.         //
  16.         
  17.         
  18.         while(1)
  19.         {
  20.                 OLED_Refresh();
  21.                 //分清楚起始位置和間隔 仿真設(shè)置芯片頻率為8M!
  22.             
  23.                 OLED_ShowString(0,0,"Voltage Measure",16,1);
  24.                 OLED_ShowString(0,16,"U1:",16,1);
  25.                 OLED_ShowNum(22,16,ADC_DMA_IN5,4,16,1);
  26.                 delay_ms(200);
  27.                
  28.         }

  29. }
復(fù)制代碼


屏幕截圖 2023-04-02 124237.png
回復(fù)

使用道具 舉報(bào)

ID:291668 發(fā)表于 2023-4-2 17:00 | 顯示全部樓層
是不是gpio時(shí)鐘沒有配置正確?
回復(fù)

使用道具 舉報(bào)

ID:875228 發(fā)表于 2023-4-2 17:16 | 顯示全部樓層
li64331218 發(fā)表于 2023-4-2 17:00
是不是gpio時(shí)鐘沒有配置正確?

是adc的gpio時(shí)鐘配置那里嗎
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-4-2 17:16 | 顯示全部樓層
li64331218 發(fā)表于 2023-4-2 17:00
是不是gpio時(shí)鐘沒有配置正確啊?

GPIO時(shí)鐘配置正確。
回復(fù)

使用道具 舉報(bào)

ID:1069599 發(fā)表于 2023-4-3 09:05 | 顯示全部樓層
我記得proteus里的C8T6要模數(shù)轉(zhuǎn)換必須要外接ADC芯片,不然代碼無效
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表