今天真呀真高興! 中了個TIMESS小鬧鐘,感謝論壇!
分享今天遇到的一個stm8s模數轉換的小問題~~~
這款單片機一共提供了7個模數轉換通道,他們分別是AIN0-AIN5和AIN12。
[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的時候,如果使用上面的代碼就不能正確使用這個通道了。爲什麼呢? 看下圖
注意大紅框中的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好用沒毛病!!!