AD/DA輸入輸出、PWM及其它底層硬體控制,.Net Micro Framework官方底層驅動代碼及上層C#庫并沒有對這些功能進行封裝,是以要想添加這類硬體的控制接口,需要從下到上進行全方位設計。
AD模拟量的采集沒有想象的那麼簡單,從轉換方式來說,有單次轉換、連續轉換之分,從模式來說,有掃描模式和間斷模式,而間斷模式下又分為規則組和注入組,采集時各通道可以獨立采集,也可以批量采集等等。
簡單期間,我這裡僅封裝了間斷模式下的規則組獨立采集方式(單次轉換)。
針對驅動層,我定義了如下函數接口:
BOOL CPU_ADC_Initialize();
void CPU_ADC_Uninitialize();
BOOL CPU_ADC_Start(UINT8 adc);
BOOL CPU_ADC_Stop(UINT8 adc);
BOOL CPU_ADC_Read(UINT8 index,UINT16 *value, UINT32 spm, UINT32 flag );
針對STM32F10xxx系列的晶片,包含ADC0、ADC1、ADC2三個AD控制器,每一個又包含18個采集通道(其中兩路是内部通道),其中ADC0的内部通道16、17分别為晶片溫度和晶片電壓值。
C#上層庫的接口定義如下:
namespace YFSoft.Hardware
{
public sealed class ADC
{
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern static bool Start(byte adc);
public extern static bool Stop(byte adc);
public extern static bool Read(byte channel, out int value, uint spm, uint flag);
}
}
其中的spm為采樣時間,總轉換時間TCONV = 采樣時間+ 12.5個周期
采樣時間的取值(0~7)
000:1.5周期
100:41.5周期
001:7.5周期
101:55.5周期
010:13.5周期
110:71.5周期
011:28.5周期
111:239.5周期
AD的輸入時鐘為1/8主頻。
AD采集的示例代碼如下:
using System;
using Microsoft.SPOT;
using YFSoft.Hardware;
using System.TinyGUI;
using System.Threading;
namespace ADCTest
public class Program
public static void Main()
{
int value = 0;
ADC.Start(0); //ADC0
while (true)
{
Graphics.SuspendLayout();
Graphics.Clear(Color.Black);
for (int i = 0; i < 18; i++)
{
ADC.Read((byte)i, out value, 2, 0);
Graphics.DrawString(10, 10 + i * 15, i.ToString()+" - "+ value.ToString(), Color.White);
}
Graphics.ResumeLayout();
Thread.Sleep(1000);
}
//ADC.Stop(0);
}
運作結果如下圖:

(1)、對應WAKEUP鍵,按下、松開采集值不同
(2)、可調電阻(紅牛闆子在蜂鳴器附近,EM-STM3210E在SD卡附近),轉動旋鈕,值連續變化
(3)、片内溫度,奇怪的是在家裡EM-STM3210E的值為2~3,紅牛的為0,在公司,二者都為0,不知道是否硬體問題。
以上AD接口不足以表達AD采集的所有功能,也隻是起到抛磚引玉的作用,希望廣大網友獻言獻策,提出更好的意見想法,因為接下來的PWM功能似乎更難封裝,更需要大家的意見。
-----------------------------------------------------------------------------------------
<a href="http://space.cnblogs.com/group/MFSoft/"></a>