日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]這是一個綜合的例子,演示了ADC模塊、DMA模塊和USART模塊的基本使用。  我們在這里設置ADC為連續(xù)轉換模式,常規(guī)轉換序列中有兩路轉換通道,分別是ADC_CH10(PC0)和ADC_CH16(片內溫度傳感器)。因為使用了自動多通道轉

這是一個綜合的例子,演示了ADC模塊、DMA模塊和USART模塊的基本使用。

  我們在這里設置ADC為連續(xù)轉換模式,常規(guī)轉換序列中有兩路轉換通道,分別是ADC_CH10(PC0)和ADC_CH16(片內溫度傳感器)。因為使用了自動多通道轉換,數(shù)據(jù)的取出工作最適合使用DMA方式取出,so,我們在內存里開辟了一個u16 AD_Value[2]數(shù)組,并設置了相應的DMA模塊,使ADC在每個通道轉換結束后啟動DMA傳輸,其緩沖區(qū)數(shù)據(jù)量為2個HalfWord,使兩路通道的轉換結果自動的分別落到AD_Value[0]和AD_Value[1]中。

  然后,在主函數(shù)里,就無需手動啟動AD轉換,等待轉換結束,再取結果了。我們可以在主函數(shù)里隨時取AD_Value中的數(shù)值,那里永遠都是最新的AD轉換結果。

  如果我們定義一個更大的AD_Value數(shù)組,并調整DMA的傳輸數(shù)據(jù)量(BufferSize)可以實現(xiàn)AD結果的循環(huán)隊列存儲,從而可以進行各種數(shù)字濾波算法。

  接著,取到轉換結果后,根據(jù)V=(AD_Value/4096)*Vref+的公式可以算出相應通道的電壓值,也可以根據(jù) T(℃) = (1.43 - Vad)/34*10^(-6) + 25的算法,得到片內溫度傳感器的測量溫度值了。

  通過重新定義putchar函數(shù),及包含"stdio.h"頭文件,我們可以方便的使用標準C的庫函數(shù)printf(),實現(xiàn)串口通信。

  相關的官方例程,可以參考FWLib V2.0的ADCADC1_DMA和USARTprintf兩個目錄下的代碼。

本代碼例子是基于STM32F103VBT6

/******************************************************************************

* 本文件實現(xiàn)ADC模塊的基本功能

* 設置ADC1的常規(guī)轉換序列包含CH10和CH16(片內溫度傳感器)

* 設置了連續(xù)轉換模式,并使用DMA傳輸

* AD轉換值被放在了AD_Value[2]數(shù)組內,[0]保存CH0結果,[1]保存CH16結果

* GetVolt函數(shù)計算[0]的值對應的電壓值(放大100倍,保留2位小數(shù))

* GetTemp函數(shù)計算[1]的值對應的溫度值,計算公式在相應函數(shù)內有說明

* 作者:jjldc(九九)

*******************************************************************************/

#include "stm32f10x_lib.h"

#include "stdio.h"

#define ADC1_DR_Address ((u32)0x4001244C)

vu16 AD_Value[2];

vu16 i=0;

s16 Temp;

u16 Volt;

void RCC_Configuration(void);

void GPIO_Configuration(void);

void NVIC_Configuration(void);

void USART1_Configuration(void);

void ADC1_Configuration(void);

void DMA_Configuration(void);

int fputc(int ch, FILE *f);

void Delay(void);

u16 GetTemp(u16 advalue);

u16 GetVolt(u16 advalue);

int main(void)

{

RCC_Configuration();

GPIO_Configuration();

NVIC_Configuration();

USART1_Configuration();

DMA_Configuration();

ADC1_Configuration();

//啟動第一次AD轉換

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

//因為已經(jīng)配置好了DMA,接下來AD自動連續(xù)轉換,結果自動保存在AD_Value處

while (1)

{

Delay();

Temp = GetTemp(AD_Value[1]);

Volt = GetVolt(AD_Value[0]);

USART_SendData(USART1, 0x0c); //清屏

//注意,USART_SendData函數(shù)不檢查是否發(fā)送完成

//等待發(fā)送完成

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

printf("電壓:%d.%dt溫度:%d.%d℃rn",

Volt/100, Volt%100, Temp/100, Temp%100);

}

}

int fputc(int ch, FILE *f)

{

//USART_SendData(USART1, (u8) ch);

USART1->DR = (u8) ch;

/* Loop until the end of transmission */

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)

{

}

return ch;

}

void Delay(void)

{

u32 i;

for(i=0;i<0x4f0000;i++);

return;

}

/*******************************************************************************

* Function Name : GetTemp

* Description : 根據(jù)ADC結果計算溫度

* Input : u16 advalue

* Output :

* Return : u16 temp

*******************************************************************************/

u16 GetTemp(u16 advalue)

{

u32 Vtemp_sensor;

s32 Current_Temp;

// ADC轉換結束以后,讀取ADC_DR寄存器中的結果,轉換溫度值計算公式如下:

// V25 - VSENSE

// T(℃) = ------------ + 25

// Avg_Slope

// V25: 溫度傳感器在25℃時 的輸出電壓,典型值1.43 V。

// VSENSE:溫度傳感器的當前輸出電壓,與ADC_DR 寄存器中的結果ADC_ConvertedValue之間的轉換關系為:

// ADC_ConvertedValue * Vdd

// VSENSE = --------------------------

// Vdd_convert_value(0xFFF)

// Avg_Slope:溫度傳感器輸出電壓和溫度的關聯(lián)參數(shù),典型值4.3 mV/℃。

Vtemp_sensor = advalue * 330 / 4096;

Current_Temp = (s32)(143 - Vtemp_sensor)*10000/43 + 2500;

return (s16)Current_Temp;

}

/*******************************************************************************

* Function Name : GetVolt

* Description : 根據(jù)ADC結果計算電壓

* Input : u16 advalue

* Output :

* Return : u16 temp

*******************************************************************************/

u16 GetVolt(u16 advalue)

{

return (u16)(advalue * 330 / 4096);

}

/*******************************************************************************

* Function Name : RCC_Configuration

* Description : 系統(tǒng)時鐘設置

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void RCC_Configuration(void)

{

ErrorStatus HSEStartUpStatus;

//使能外部晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部晶振穩(wěn)定

HSEStartUpStatus = RCC_WaitForHSEStartUp();

//如果外部晶振啟動成功,則進行下一步操作

if(HSEStartUpStatus==SUCCESS)

{

//設置HCLK(AHB時鐘)=SYSCLK

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//PCLK1(APB1) = HCLK/2

RCC_PCLK1Config(RCC_HCLK_Div2);

//PCLK2(APB2) = HCLK

RCC_PCLK2Config(RCC_HCLK_Div1);

//設置ADC時鐘頻率

RCC_ADCCLKConfig(RCC_PCLK2_Div2);

//FLASH時序控制

//推薦值:SYSCLK = 0~24MHz Latency=0

// SYSCLK = 24~48MHz Latency=1

// SYSCLK = 48~72MHz Latency=2

FLASH_SetLatency(FLASH_Latency_2);

//開啟FLASH預取指功能

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//PLL設置 SYSCLK/1 * 9 = 8*1*9 = 72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//啟動PLL

RCC_PLLCmd(ENABLE);

//等待PLL穩(wěn)定

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//系統(tǒng)時鐘SYSCLK來自PLL輸出

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//切換時鐘后等待系統(tǒng)時鐘穩(wěn)定

while(RCC_GetSYSCLKSource()!=0x08);

}

//下面是給各模塊開啟時鐘

//啟動GPIO

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |

RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,

ENABLE);

//啟動AFIO

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

//啟

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉