【AT32F421测评】+ ADC采样及SPI_OLED显示
[复制链接]
这篇文章将来测评AT32F421的硬件SPI和12位的ADC,首先,硬件SPI将以SPI_OLED的形式来呈现,ADC通过测试实际的电压来测试。
我选用的OLED是市面上常见的0.96寸OLED,它支持I2C和SPI接口,我将用AT32的硬件SPI将其驱动,同时作为ADC测到的电压值的显示屏。
首先,因为市面上用0.96寸的OLED的人很多,所以一些开发者或商家就编写其的通用驱动,为了提高开发效率,避免重复造轮子,我选用某园的驱动,它提供了非常多的例程,我就在其基础上修改。
首先,在HARDWARE文件夹中新建SPI.c、SPI_OLED.c 、ADC.c等三个C文件及其对应的h头文件。然后在FWLIB中添加at32f4xx_spi.c、at32f4xx_adc.c和at32f4xx_dma.c如下图所示
第二步,将某园的模拟SPI驱动复制到SPI_OLED.c,同时将
OLED_WR_Byte,也就是写入一个字节的函数修改为下图所示,将软件模拟的传输过程用硬件SPI的发送函数SPI_I2S_TxData来代替发送.
因为SPI_OLED上还有DC和RST引脚,这里我分别用PA6和PA4来代替,如下图所示,
其他的驱动函数不用修改。
第三步,配置AT32F421的硬件SPI,首先在SPI.c中的添加如下函数,以便在主函数中调用(参考官方提供的BSP中AT_START_F421中的Simplex_Interrupt示例).这里需要注意的是,第一,我们要用SPI,要进行GPIO配置,SPI对应时钟和GPIO对应时钟配置,还有就是SPI参数配置;第二,根据0.96寸OLED所使用的SSD1306驱动芯片的SPI接口的时序图,时钟初始电平可高可低,然后在上升沿的时候传输数据,所以我这里通过SPI_InitStructure.SPI_CPOL = SPI_CPOL_LOW;将初始电平配置为低电平;然后通过SPI_InitStructure.SPI_CPHA = SPI_CPHA_1EDGE;将其配置为第一个边沿变化传输,也就是上升沿.(这里补充一点,可能是个人对时序图的理解有误,在CPOL和CPHA不是配置为上面的配置时,在进行实验后似乎也是可以驱动的,但我的建议是最好配置为上述的配置),具体配置如下图所示
第四步,配置ADC,这里参考官方提供的BSP中AT_START_F421中的ADC1_DMA示例,这里我只讲重点,具体配置见附件,这里的测出来ADC数据是通过DMA搬运到某变量数组里的,通过DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)ADC_RegularConvertedValueTab;
DMA_InitStructure.DMA_BufferSize = 1;
将测出来的电压搬运到ADC_RegularConvertedValueTab这个数组里面,
然后,我将依次测试ADC测量外部电压和内部参考电压.
下面这么写是测量ADC1的通道1的外部电压值,也就是PA1的外部值
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239_5);
//测试通道1 PA1
下面这么写是可以测量内部参考电压
ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,1,ADC_SampleTime_239_5);//测试内部参考电压
记得添加上下面这句,这个是使能ADC测量内部温度传感器和参照电压的函数
/* Enables Temperature Sensor and Vrefint Channel */
ADC_TempSensorVrefintCtrl(ENABLE);
最后,在主程序中写入如下函数,单片机将1s的刷新速度更新采集到的实际电压值,这里需要进行一个转化,ADC_RegularConvertedValueTab[0]*3282/4096.0;这条语句中的3282就是代表我用万用表测到的单片机的工作电压为3282mv,不同情况下该电压值可能会不同,这个是需要修改的.
最后展示一下实际测量结果,先测量一下单片机内部的参考电压,根据数据手册,此参照电压应该在1.20V附近
实际测量为1.206V,符合标准
接下来测试不同电压值,经过和四位半的已校准的万用表进行对比,AT32F421的ADC还是非常可靠的 ,精度很高
本次对AT32F421的ADC和SPI测试完毕
|