【AT-START-M412测评】+A/D数据采集与TFT屏显示
A/D数模转换功能是常规开发板都具备的基本功能,对于AT-START-M412开发板来说自然也不例外。此外,利用A/D采集的多个检测通道还可实现多个目标的信号采集和感知,为能直观地以波形图的方式来观察,可利用开发板上的Arduino接口来快速连接一个TFT屏来实现。
以3通道的数据采集为例,其进行采集的配置函数为:
static void adc_config(void)
{
adc_common_config_type adc_common_struct;
adc_base_config_type adc_base_struct;
crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
nvic_irq_enable(ADC1_2_IRQn, 0, 0);
adc_common_default_para_init(&adc_common_struct);
adc_common_struct.combine_mode = ADC_INDEPENDENT_MODE;
adc_common_struct.div = ADC_HCLK_DIV_6;
adc_common_struct.common_dma_mode = ADC_COMMON_DMAMODE_DISABLE;
adc_common_struct.common_dma_request_repeat_state = FALSE;
adc_common_struct.sampling_interval = ADC_SAMPLING_INTERVAL_4CYCLES;
adc_common_struct.tempervintrv_state = FALSE;
adc_common_config(&adc_common_struct);
adc_base_default_para_init(&adc_base_struct);
adc_base_struct.sequence_mode = TRUE;
adc_base_struct.repeat_mode = FALSE;
adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
adc_base_struct.ordinary_channel_length = 2;
adc_base_config(ADC1, &adc_base_struct);
adc_resolution_set(ADC1, ADC_RESOLUTION_12B);
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_2, 1, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_4, 2, ADC_SAMPLETIME_239_5);
adc_ordinary_conversion_trigger_set(ADC1, ADC_ORDINARY_TRIG_TMR1CH1, ADC_ORDINARY_TRIG_EDGE_NONE);
adc_dma_mode_enable(ADC1, TRUE);
adc_dma_request_repeat_enable(ADC1, TRUE);
adc_occe_each_conversion_enable(ADC1, TRUE);
adc_interrupt_enable(ADC1, ADC_OCCO_INT, TRUE);
adc_interrupt_enable(ADC1, ADC_TCF_INT, TRUE);
adc_convert_fail_auto_abort_enable(ADC1, TRUE);
adc_enable(ADC1, TRUE);
while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);
adc_calibration_init(ADC1);
while(adc_calibration_init_status_get(ADC1));
adc_calibration_start(ADC1);
while(adc_calibration_status_get(ADC1));
}
经运行,其结果图1所示。
图1 数据采集结果
为进行数据显示和波形绘制,TFT屏使用的J3接口,见图2所示。
图2 所用接口
TFT屏的具体连接关系为:
CS----PA5
RST---PA6
DC---PA7
SD---PA15
SCK---PB7
LED---PA9
TFT屏的引脚配置函数为:
void TFT_config()
{
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_9|GPIO_PINS_15;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
gpio_init_struct.gpio_pins = GPIO_PINS_7;
gpio_init(GPIOB, &gpio_init_struct);
}
显示屏的初始化函数为:
void tft_Init(void)
{
// ili9220B
LCD_REST_Low();
delay_ms(20);
LCD_REST_High();
delay_ms(20);
LCD_CS_Low();
LCD_WR_REG(0xCB);
LCD_WR_DATA8(0x39);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x34);
LCD_WR_DATA8(0x02);
LCD_WR_REG(0xCF);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0XC1);
LCD_WR_DATA8(0X30);
LCD_WR_REG(0xE8);
LCD_WR_DATA8(0x85);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x78);
LCD_WR_REG(0xEA);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xED);
LCD_WR_DATA8(0x64);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0X12);
LCD_WR_DATA8(0X81);
LCD_WR_REG(0xF7);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC0); //Power control
LCD_WR_DATA8(0x23); //VRH
LCD_WR_REG(0xC1); //Power control
LCD_WR_DATA8(0x10); //SAP;BT
LCD_WR_REG(0xC5); //VCM control
LCD_WR_DATA8(0x3e);
LCD_WR_DATA8(0x28);
LCD_WR_REG(0xC7); //VCM control2
LCD_WR_DATA8(0x86); //--
LCD_WR_REG(0x36); // Memory Access Control
LCD_WR_DATA8(0x48);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x55);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x18);
LCD_WR_REG(0xB6); // Display Function Control
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x82);
LCD_WR_DATA8(0x27);
LCD_WR_REG(0xF2); // 3Gamma Function Disable
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x26); //Gamma curve selected
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xE0); //Set Gamma
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x4E);
LCD_WR_DATA8(0xF1);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0XE1); //Set Gamma
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0xC1);
LCD_WR_DATA8(0x48);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0x11); //Exit Sleep
delay_ms(120);
LCD_WR_REG(0x29); //Display on
LCD_WR_REG(0x2c);
LCD_LED_High();
}
以软件方式模拟SPI进行字节数据方式的函数为:
void LCD_Writ_Bus(unsigned char com)
{
实现字符显示的函数为:
void LCD_ShowChar(unsigned int x,unsigned int y,char num,char mode)
{
char temp;
char pos,t;
unsigned int x0=x;
unsigned int colortemp=POINT_COLOR;
if(x>LCD_W-16||y>LCD_H-16)return;
num=num-' ';
Address_set(x,y,x+8-1,y+16-1);
if(!mode)
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(unsigned int)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01)POINT_COLOR=colortemp;
else POINT_COLOR=BACK_COLOR;
LCD_WR_DATA(POINT_COLOR);
temp>>=1;
x++;
}
x=x0;
y++;
}
}
实现数据显示的函数为:
void LCD_ShowNum(unsigned int x,unsigned int y,unsigned int num,char len)
{
char t,temp;
char enshow=0;
num=(unsigned int)num;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+(8*t),y,' ',0);
continue;
}
实现字符串显示的函数为:
void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
{
while(*p!='\0')
{
if(x>LCD_W-16){x=0;y+=16;}
if(y>LCD_H-16){y=x=0;}
LCD_ShowChar(x,y,*p,0);
x+=8;
p++;
}
}
由于在进行多通道数据采集时会遇到引脚使用出现重叠的问题,为此这里仅使用PA2和PA4这2个引脚进行双通道的数据采集,这个引脚分别处于J5和J6上,见图3所示。
图3A/D采集所用接口
实现双通道数据采集及显示的主程序为:
int main(void)
{
__IO uint32_t index = 0;
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
system_clock_config();
at32_board_init();
at32_led_off(LED2);
at32_led_off(LED3);
at32_led_off(LED4);
p_adc1_ordinary = adc1_ordinary_valuetab;
uart_print_init(115200);
gpio_config();
TFT_config();
tft_Init();
LCD_Clear(RED);
BACK_COLOR=RED;
POINT_COLOR=YELLOW ;
LCD_ShowString(20,10,"AT32M412 TEST!");
LCD_ShowString(20,40,"adc1_channel_2 =");
LCD_ShowString(20,60,"adc1_channel_4 =");
adc_config();
printf("use_polling_get_conversion_data \r\n");
adc_ordinary_software_trigger_enable(ADC1, TRUE);
while(1)
{
while(adc_flag_get(ADC1, ADC_OCCE_FLAG) == RESET);
*(p_adc1_ordinary++) = adc_ordinary_conversion_data_get(ADC1);
index++;
if((adc1_overflow_flag != 0) || (adc1_conversion_fail_flag != 0))
{
adc_enable(ADC1, FALSE);
at32_led_on(LED3);
at32_led_on(LED4);
printf("error occur\r\n");
printf("adc1_overflow_flag = %d\r\n",adc1_overflow_flag);
printf("adc1_conversion_fail_flag = %d\r\n",adc1_conversion_fail_flag);
index = 0;
adc_enable(ADC1, TRUE);
}
if(index%2 == 0)
{
LCD_ShowNum(160,40,adc1_ordinary_valuetab,4);
LCD_ShowNum(160,60,adc1_ordinary_valuetab,4);
delay_sec(1);
p_adc1_ordinary = adc1_ordinary_valuetab;
adc_ordinary_software_trigger_enable(ADC1, TRUE);
}
}
}
经程序的编译和下载,其测试效果如图4所示。为测试通道2的响应效果,是将输入接到GND,说明检测值完全可得到零。
图4 测试效果
页:
[1]