导语
智慧农业系统是未来农业发展的趋势所在,它能够通过传感器,实时检测作物的各种生长状况,和各类环境数据。通过联网与大数据的比对获取,并通过智能硬件提供适合作物生长的最佳温度,湿度,酸碱盐等。
在智能农业发展的道路上,一直存在一个难关。那就是关于智能硬件供电问题。数据采集接口由智能硬件提供,面对超大范围的组网,电缆不可能布置到每一个点上。那么对于智能硬件功耗的要求就非常高。
Ambiq 拥有的亚阀值功率优化技术专利,使得其能耗比性能相当的mcu 低个5至10倍,这个技术重新定义了“低功耗”。正因为这个技术,Apollo2 mcu 也是最适合智慧农业智能硬件的主mcu 。14位的ADC,6组 IC接口,2组UART,等丰富的外设接口,能够保证各类传感器的需求。
智能硬件低功耗设计及各类驱动接口
低功耗设计,Apollo2 mcu 可以直接使用官方移植好的FreeRTOS。系统中通过以下设定,选择需要保留的FLASH,SRAM大小。同时也能够选择各类外设接口的开断电。
Am_hal_pwrctrl_memory_enable 主要是针对flash 和 SRAM。可选大小如下:
AM_HAL_PWRCTRL_MEMEN_CACHE
AM_HAL_PWRCTRL_MEMEN_CACHE_DIS
AM_HAL_PWRCTRL_MEMEN_FLASH512K
AM_HAL_PWRCTRL_MEMEN_FLASH1M
AM_HAL_PWRCTRL_MEMEN_SRAM8K
AM_HAL_PWRCTRL_MEMEN_SRAM16K
AM_HAL_PWRCTRL_MEMEN_SRAM24K
AM_HAL_PWRCTRL_MEMEN_SRAM32K
AM_HAL_PWRCTRL_MEMEN_SRAM64K
AM_HAL_PWRCTRL_MEMEN_SRAM96K
AM_HAL_PWRCTRL_MEMEN_SRAM128K
AM_HAL_PWRCTRL_MEMEN_SRAM160K
AM_HAL_PWRCTRL_MEMEN_SRAM192K
AM_HAL_PWRCTRL_MEMEN_SRAM224K
AM_HAL_PWRCTRL_MEMEN_SRAM256K
AM_HAL_PWRCTRL_MEMEN_ALL (the default, power-up state)
而am_hal_pwrctrl_periph_enable主要是对外设接口的使能,可选范围:
AM_HAL_PWRCTRL_PWRONSTATUS_IOS_UARTS
AM_HAL_PWRCTRL_PWRONSTATUS_IOM_3_5
AM_HAL_PWRCTRL_PWRONSTATUS_IOM_0_2
AM_HAL_PWRCTRL_PWRONSTATUS_ADC
AM_HAL_PWRCTRL_PWRONSTATUS_PDM
如果客户没有连续采集或者传输要求,在低功耗模式下,都按最小flash和SRAM保留,接口使用完之后进行断电关闭。
使用spi接口点亮OLED屏,首先是开启IOM_0_2的POWER(根据个人选择那组IO决定)紧接着进行初始化SPI,初始化OLED,执行显示代码,关闭OLED,关闭SPI POWER。粗略流程如下:
Apollo2 MCU 的SPI和I?C 是共用IOM接口,所以在配置上面没有太大的区别。
需修改Mode选择(AM_HAL_IOM_SPIMODE/ AM_HAL_IOM_I2CMODE)
和对应的GPIO口配置。而速率,时钟极性和相位,读写的字符长度都是在config里面进行修改。
UART是常用的异步串口通信协议,传输数据是以字节形式,一位位串行输出。
几个重要的位置:
1)起始位:先发出一个逻辑“0”的信号,表示传输字符开始。
2)数据位:紧接着起始位之后。数据靠时钟进行定位,数据位的个数可以由用户决定。
3)奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以次来校验数据传送的正确性。
4)停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。停止位不仅仅是表示传输的结束,并且提供设备之间时钟的校准。
图1
各个位的配置,在am_hal_uart_config_t中完成:
(1)Apollo2 mcu ,UART的初始化程序如下
uart_init(uint32_t ui32Module)
{
// Make sure the UART RX and TX pins are enabled
am_bsp_pin_enable(COM_UART_TX);
am_bsp_pin_enable(COM_UART_RX);
//
// Power on the selected UART
//
am_hal_uart_pwrctrl_enable(ui32Module);
am_hal_uart_clock_enable(ui32Module);
//
// Disable the UART before configuring it.
//
am_hal_uart_disable(ui32Module);
//
// Configure the UART.
//
am_hal_uart_config(ui32Module, &g_sUartConfig);
//
// Enable the UART FIFO.
//
am_hal_uart_fifo_config(ui32Module,AM_HAL_UART_TX_FIFO_1_2| AM_HAL_UART_RX_FIFO_1_2);
am_hal_uart_enable(ui32Module);
}
(2)在使用串口需要注意两点
第一:串口数据传输,有可能会被各类更高优先级的中断打断,所以为了保证数据的完整性,应该设置中断保护机制。
第二:因为串口输出需要一定的打印时间,如果时间不足,同样会导致数据不完整或者丢失。可以调用以下方法解决:
Void uart_transmit_delay(uint32_t ui32Module)
{
//
// Wait until busy bit clears to make sure UART fully transmitted last byte
//
while(am_hal_uart_flags_get(ui32Module)& AM_HAL_UART_FR_BUSY );
}
使用例子如下列代码:
am_util_stdio_printf("Hello World! ");
uart_transmit_delay(ui32Module);
ADC转换,通常是指一个将模拟信号转变为数字信号。这是一个,把经过与标准量比较处理后的模拟量转换成以二进制数值表示的一个过程。故任何一个ADC转换都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。