TA的每日心情 | 开心 2019-11-19 11:07 |
---|
签到天数: 226 天 连续签到: 1 天 [LV.7]常住居民III
|
做ADC采样实验更能看出板卡的文档以及案例的不太宜人,无奈只好瞎试了,还在有点看文档的基础结果多册尝试总算解决了几个问题:
A. ADC的输出口不是ADC0,是ADC1的几个通道,这是非常误人子弟的,因为几个案例中都设置为ADC0,因此无论如何得不到结果!
B. 案例中没有如何得到ADC的采样结果的方法,只好穷搜,算是找到了,但还是没有找到如何开通多个通道获取多个通道的ADC采样指的方法。
下边将ADC1的3通道采样实验罗列如下:
首先定义ADC1的一些口参数:
#define BOARD_ADC_CHANNEL1 ADC_CHANNEL_3
#define ADC_GPIO_PORT GPIOA
#define ADC_GPIO_PIN1 GPIO_PIN_3
接着增加定义1个32位的val0变量:
uint32_t val0,js;
接着在ioInit函数中增加定义ADC口的语句:
gpio_mode_set(ADC_GPIO_PORT,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,(ADC_GPIO_PIN1|ADC_GPIO_PIN2));
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_ADC1);
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
增加1个函数初始化ADC:
//configure the ADC peripheral
void adcInit(void){
//ADC channel length config
adc_channel_length_config(ADC1,ADC_REGULAR_CHANNEL,2);
//ADC regular channel config
adc_regular_channel_config(ADC1,0,(BOARD_ADC_CHANNEL1|BOARD_ADC_CHANNEL2),ADC_SAMPLETIME_56);
//ADC external trigger enable
adc_external_trigger_config(ADC1,ADC_REGULAR_CHANNEL,EXTERNAL_TRIGGER_DISABLE);
//ADC data alignment config
adc_data_alignment_config(ADC1,ADC_DATAALIGN_RIGHT);
adc_resolution_config(ADC1,ADC_RESOLUTION_12B);
adc_oversample_mode_config(ADC1,ADC_OVERSAMPLING_ALL_CONVERT,ADC_OVERSAMPLING_SHIFT_NONE,ADC_OVERSAMPLING_SHIFT_NONE);
adc_oversample_mode_disable(ADC1);
adc_special_function_config(ADC1,ADC_SCAN_MODE,ENABLE);
//enable ADC interface/
adc_enable(ADC1);
//ADC calibration and reset calibration/
adc_calibration_enable(ADC1);
}
注意此函数定义了两个通道,但不知如何触发第2个通道和如何采样,因此只是摆设。下边以软触发打开测试ADC采样函数[12比特采样结果]:
//ADC Test one
void adcTest(void){
//ADC resolusion 12B
adc_enable(ADC1);
adc_software_trigger_enable(ADC1,ADC_REGULAR_CHANNEL);
while(RESET==adc_flag_get(ADC1,ADC_FLAG_EOC));
delay_1ms(5);
val0=ADC_RDATA(ADC1);
adc_disable(ADC1);
}
这样主函数的循环中调用一次此函数,采样1次并获得结果1个。main主函数改为:
int main(void){
systick_config();
ioInit();
gd_eval_com_init(EVAL_COM1);
adcInit();
lcdInit();
lcdClear();
dispBase();
while(1){
js++;
ledTest();
adcTest();
printf("JSQ=%d ADC0=%d \n\r",js,val0);
dispMes();
delaym(1000);
}
}
最后增加显示基础的布局和测试结果的两个函数:
//Display BaseData
void dispBase(void){
c2l(3,0,19);c2l(3,1,28);//JS
c2l(2,0,10);c2l(2,1,0);//c2l(2,8,10);c2l(2,9,1);//A0 A1
//c2l(1,0,25);c2l(1,1,32);c2l(1,2,22);c2l(1,8,25);c2l(1,9,32);c2l(1,10,22);//PWM PWM
//c2l(0,0,25);c2l(0,1,21);c2l(0,2,29);c2l(0,3,40);c2l(0,9,28);//PLT:
}
//Display Test Data
void dispMes(void){
c2l(3,3,(js/100000)%10);c2l(3,4,(js/10000)%10);c2l(3,5,(js/1000)%10);c2l(3,6,(js/100)%10);c2l(3,7,(js/10)%10);c2l(3,8,(js)%10);
c2l(2,3,(val0/1000)%10);c2l(2,4,(val0/100)%10);c2l(2,5,(val0/10)%10);c2l(2,6,(val0)%10);//c2l(2,7,(val0)%10);
}
编译下载后的结果串口数据见图31,硬件效果见照片32。注意这两个函数在最后,前边应该声明!
|
-
31
-
32
|