|
由于使用STM32的F103MCU,proteus選擇R6型號(hào),所以CUBEMX選型STM32F103R6。
proteus仿真頻率不能太高,所以CUBEMX時(shí)鐘使用內(nèi)部8MHz。使用了串口USART1波特率設(shè)置為9600,也是考慮為了適應(yīng)proteus,使ADC1。選擇IN1、IN2、IN3三個(gè)通道。其余參數(shù)設(shè)置如下圖1。注意設(shè)置三個(gè)規(guī)則通道的采集順序:IN1:rank1、IN2:rank2、IN3:rank3。
圖1.png (58.48 KB, 下載次數(shù): 55)
下載附件
圖1
2023-5-27 00:01 上傳
DMA設(shè)置 add ADC1,設(shè)置如下圖2:
圖2.png (25.02 KB, 下載次數(shù): 51)
下載附件
圖2
2023-5-27 00:01 上傳
生成keil初始化工程,添加串口一重定位代碼(可添加到main.c中):
#if 1
#include <stdio.h>
/* 告知連接器不從C庫鏈接使用半主機(jī)的函敿 */
#pragma import(__use_no_semihosting)
/* 定義 _sys_exit() 以避免使用半主機(jī)模式 */
void _sys_exit(int x)
{
x = x;
}
/* 標(biāo)準(zhǔn)庫需要的支持類型 */
struct __FILE
{
int handle;
};
FILE __stdout;
/* */
int fputc(int ch, FILE* stream)
{
/* 堵塞判斷串口是否發(fā)鿁完房 */
/* 不同芯片的串口標(biāo)志位不一定相同! */
while((USART1->SR & 0X40) == 0);
/* 串口發(fā)鿁完成,將該字符發(fā)鿿 */
USART1->DR = (uint8_t) ch;
return ch;
}
#endif
主函數(shù)如:
int main(void)
{
uint16_t ADC_Value[90];
uint8_t i;
uint16_t ad1, ad2, ad3;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
while(1)
{
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC_Value,90);
for(i=0,ad1=0,ad2=0,ad3=0;i<90;){
ad1 += ADC_Value[i++];
ad2 += ADC_Value[i++];
ad3 += ADC_Value[i++];
}
ad1 /=30;ad2 /=30;ad3 /=30;
printf("\r\n========ADC-DMA-TEST=========\r\n");
printf("V_in1=%1.3fV\r\n",ad1*5.0f/4096);
HAL_Delay(50);
printf("V_in2=%1.3fV\r\n",ad2*5.0f/4096);
HAL_Delay(50);
printf("V_in3=%1.3fV\r\n",ad3*5.0f/4096);
HAL_Delay(50);
}
/* USER CODE END 3 */
}
我用的是proteus8.15 ,都懂的方法安裝的。proteus仿真效果如下:
這個(gè)實(shí)例proteus仿真很難成功,可以觀察采集結(jié)果,但是電壓數(shù)值一直變化,究竟是DMA使用不對(duì),還是proteus的問題,請(qǐng)各位大神幫忙分析一下。
所有工程(proteus、CUBEMX,keil-mdk)全部奉上,供交流學(xué)習(xí)。
仿真2.jpg (129.18 KB, 下載次數(shù): 58)
下載附件
仿真
2023-5-26 23:58 上傳
Keil代碼與Proteus仿真下載:
STM32F103R6-HAL - ADC_DMA多通道采集.7z
(421.38 KB, 下載次數(shù): 79)
2023-5-27 00:57 上傳
點(diǎn)擊文件名下載附件
各工程文件 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|