今天我又花样作死看了一下K60在用LPLD固件库下ADC的使用
由于使用固件库,这里的ADC就像PIC里的一样(51的忘了,好久没用了)
但是这里有几个和以前我接触过得单片机不一样的,就是以前玩的单片机ADC模块都只要设置好VCF基准电压,用哪个通道,像PIC的就多一个左对齐右对齐,时钟选择就没了。
这里还要配置是使用单端采集还是差分采集,ADC精度,采样时间,硬件平均(其实这个我没搞懂是什么东西)
关于单端还是差分,我就用LPLD里用的那个图说好了
如果用单端,就是只用ADC0 DP1把外部的电压读入进行ADC;如果是差分需要把ADC0 DP1和ADC0
DM1都读入,取他们的差值ADC,所以会出现负数。我记得LPLD是这么说的,当电压有波动不稳定时,采用单端就会不稳定,但是采用差分就会抵消掉波动,能得到稳定的电压。
ADC精度,我感觉这是 一个非常人性化的设置,居然还可以设置ADC精度,像以前PIC精度都是固定的= =
单端精度有8位10位12位16位
差分精度有9位11位13位16位
对于设置不同的精度,得到的返回值也会不同,例如单端8位
0~255,单端16位0~65535;所以不同的精度设置,在调节开发板上的电阻可能会不一样
采样时间应该就是越长越准吧,没这么注意
硬件平均就不知道了,问了同学也没能解决
对了,我的板子上的ADC是这样接的
接下来贴上代码
ADC初始化
void adc_init(void)
{
//配置ADC采样参数
adc_init_struct.ADC_Adcx = ADC1;
adc_init_struct.ADC_DiffMode = ADC_SE;
//单端采集
adc_init_struct.ADC_BitMode = SE_8BIT;
//单端12位精度
adc_init_struct.ADC_SampleTimeCfg =
SAMTIME_SHORT; //短采样时间
adc_init_struct.ADC_HwAvgSel = HW_4AVG;
//4次硬件平均
adc_init_struct.ADC_CalEnable = TRUE;
//使能初始化校验
//初始化ADC
LPLD_ADC_Init(adc_init_struct);
//为了保证复用功能不被占用,最好使能相应ADC通道
//RUSH开发板的电位器使用DAD1通道进行采集
//单端DAD1通道的引脚为(ADC1_DM1)
LPLD_ADC_Chn_Enable(ADC1,
AD20);
}
gpio初始化
void init_gpio()
{
gpio_init_struct.GPIO_PTx = PTA;
gpio_init_struct.GPIO_Pins =
GPIO_Pin10;
gpio_init_struct.GPIO_Dir =
DIR_OUTPUT;
gpio_init_struct.GPIO_Output =
OUTPUT_H;
gpio_init_struct.GPIO_PinControl =
IRQC_DIS;
LPLD_GPIO_Init(gpio_init_struct);
}
我这里用的ADC输入,若超过某个值就点亮一盏灯
主函数里一点要初始化ADC和GPIO,我已开始没有初始化GPIO以为我ADC程序错了,检查了半天,还有不要忘记声明ADC,GPIO函数和初始化类
void main (void)
{
uint16 result;
//初始化ADC
adc_init();
init_gpio();
while(1)
{
result =
LPLD_ADC_Get(ADC1, AD20);
if(result>100)
PTA10_O=0;
else
PTA10_O=1;
}
}
运行
一开始没到边界值
到边界值了,有点微闪
超过边界值,就很亮了
oh。。。。。。h,yeah