使用STM8S105K4T6C 模數轉換器的12通道

今天真呀真高興! 中了個TIMESS小鬧鐘,感謝論壇!

分享今天遇到的一個stm8s模數轉換的小問題~~~
      這款單片機一共提供了7個模數轉換通道,他們分別是AIN0-AIN5和AIN12。

stm8s105k4t6c的管腳圖
     其中AIN0-AIN5的配置和使用方法如下,配置爲連續轉換、掃描模式(代碼寫的不好,大神請見諒~):
[mw_shl_code=c,true]/*---------------------------------包含頭文件---------------------------------*/
#include "adc.h"

#define        ADC        60                                                                                                                                  //濾波深度,不宜過高,防止越界 u16

/*---------------------------------全局標誌位---------------------------------*/

/*----------------------------------函數定義----------------------------------*/

//*----------------ADC1端口初始化函數---------------*/
static void Adc_Gpio_Init(void)                                                                                                                //使用第12通道
{
        GPIO_Init(GPIOF, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);
}

/*------------------ADC1初始化函數-----------------*/
void Adc1_Init(void)
{   
        Adc_Gpio_Init();
        ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,                                                                          //連續轉換
                         (ADC1_Channel_TypeDef)(ADC1_CHANNEL_12),                                                          //開啓12通道
                         ADC1_PRESSEL_FCPU_D2,                                                                                          //2分頻
                         ADC1_EXTTRIG_TIM,
                         DISABLE,                                                                                                                   //關閉外部觸發
                         ADC1_ALIGN_RIGHT,                                                                                                  //右對齊
                         (ADC1_SchmittTrigg_TypeDef)(ADC1_SCHMITTTRIG_CHANNEL12),                        
                         DISABLE);                                                                                                                  //關閉施密特觸發器
        ADC1_Cmd(ENABLE);                                                                                                                          //使能ADC1
        ADC1_DataBufferCmd(ENABLE);                                                                                                  //開啓緩存
        ADC1_ScanModeCmd(ENABLE);                                                                                                          //啓用掃描模式
        ADC1_StartConversion();                                                                                                          //開始轉換
}

/*-------------------ADC獲取AD值------------------*/
uint16_t Get_Adc1_Value(ADC1_Channel_TypeDef channel)  
{
uint8_t t;
uint16_t data = 0;
for(t=0;t<ADC;t++)
{
   data+=ADC1_GetBufferValue(channel);
}
   return (uint16_t)(data/ADC);             //返回轉換平均值
}
/*--------------Write-by-xiao-kai\2017\05\06\17\14----QQ-850637704------------*/
/*-------------------------Always have a nice day-----------------------------*/[/mw_shl_code]


當我們想使用AIN12的時候,如果使用上面的代碼就不能正確使用這個通道了。爲什麼呢?  看下圖

stm8s105k4t6c ADC1簡介

     注意大紅框中的NOTE:大概的意思是說:額外的AIN12通道不能用於ADC掃描模式和模擬看門狗模式,而且AIN12通道轉換結果只會存在 ADC_DRH/ADC_DRL這兩個寄存器中!  

     既然是這樣:那我們應該去stm8s的固件庫中去尋找可以操作AIN12的函數咯,要注意庫寄存器的風格,查找的格式應該是“ADC1->DRL”或"ADC1->DRH",就會找到uint16_t ADC1_GetConversionValue(void),
而且就只有這個函數使用到了這兩個寄存器,就是它了!!!
     然後把上面操作AIN0-AIN5的初始化函數註釋掉ADC1_ScanModeCmd(ENABLE); //啓用掃描模式,調用ADC1_GetConversionValue()就可以了,STM8S好用沒毛病!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章