STM32L432 Nucleo开发板评测(4)差分ADC
本帖最后由 wenyangzeng 于 2017-1-3 13:41 编辑STM32L432 Nucleo开发板评测(1)
评测2:初试STM32L432 : (4楼)
评测3:可编程增益运放PGA:(5楼)
评测(4)差分ADC (6楼)
有幸收到ST社区寄来ST公司最新推出的STM32L432Nucleo开发板进行评测。 开发板的包装继承ST系列开发板包装风格:
图1 STM32L432 Nucleo开发板 主芯片是M4系列ATM32L432KCU632PINSARM Cortex-M480MHZ256-KB Flash,64-KBSRAMExtensionconnectors:Arduino NanoEmbeddedST-LINK/V2-1 debugger/ProgrammerMbed-enabled
正面STM32L432KBU6
背面 STLINK/V2-1
内包装印刷将这个芯片在开发板上的引脚顺序都标出来,方便使用
STM32L4系列将微控制器能效和性能提升到新的高度。为简化设计、提高应用灵活性,新系列微控制器引入新的外设封装组合。 卓越的性能和能效源优势来自于智能架构特性,例如外设电源电压独立调节、可设置多速内部时钟以及数据批量处理模式(BAM)、自适应实时(ART)加速器(ARTAcceleratorTM)。此外,包括超低功耗8nA关机在内的多模电源管理有助于最大限度地提升能效。 STM32L432使100 DMIPS的ARM® Cortex®-M4处理器内核性能实现闪存需求最高256KB的轻型微控制器应用。 STM32L432的一个亮点是配备没有外置晶体振荡器即可工作的全速USB控制器、模拟外设、音频功能和无晶体USB控制器;此外,还增加一个加密加速器。 无论是保护穿戴式设备或家庭自动化控制器等物联网产品(IoT)的数据安全,还是给工业或医疗设备增加多功能外设和通信接口,STM32L4的附加功能为设计人员扩大了选择范围,从而提升了设计灵活性。STM32L432KBU6内置128KB闪存和64KB 静态随机存储器(SRAM)。参考样品价格约为2.13美元。STM32L432的例程en.stm32cubel4.zip:https://pan.baidu.com/s/1gePCi9X?errno=0&errmsg=Auth%20Login%20Sucess&stoken=f2745536838fe30a6042318c7fe21db92334ee819ad33079fdb89c6e27749d376447e55b74c9c5b0ccd8076a5068a2bb4426cdf53827826e9693c9777d3ffc68e7e9ff16fcf2&bduss=0b6ae1989fbb76d7727c414f1450057c9220c30971b868cad2ee93881a6d64fee3d7b583107f7ed18f800ec28f1b9822ef64c823d557fed5e41c1e0ec91c5484a18bda5181057a43e1ac957b163216fc0e9769cd5045cea1eeac383dafa6cf6f4234cd5210568b0a629790eb9efd741a724bd1cd6757b8d04c50f14be1b6ec0f594fdf4caea8641e2086fc4f725c90ccdc7aff04707bf700757ca570d7a29a5526a6d1743946cf854707b47468b10bd7993760475984e789df7c3a784626e3951bd10166aa75&ssnerror=0
STM32L432的MDK5驱动:http://az717401.vo.msecnd.net/pack/Keil.STM32L4xx_DFP.1.2.0.pack下载这个软件包有点类似打热线电话一样,要看你的运气了。 STM32L432 Nucleo开发板的评测心得今后将逐一与大家分享。
(待续)
评测(4)差分ADC
打开STM32CublMX,准备对ADC_IN5(PA0)进行ADC配置:
配置过程中发现STM32L432的ADC具有差分ADC功能(图中蓝色方框),ADC差分方式能大大提高ADC转换结果的信噪比。在这颗小小的芯片上居然集成了差分ADC,实在太难得了。
当ADC_IN5配置成差分ADC输入时,ADC_IN6(PA1)自动配对成反相差分输入,差分运放与STM32L432简化连接见下图:
同时为ADC配置了DMA。ADC配置
#include "adc.h"
#include "gpio.h"
#include "dma.h"
/* USER CODE BEGIN 0 */
#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t)64)
extern uint16_t aADCxConvertedData;
/* USER CODE END 0 */
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
/* ADC1 init function */
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
/**Common config
*/
hadc1.Instance = ADC1;
if (HAL_ADC_DeInit(&hadc1) != HAL_OK)
{
/* ADC de-initialization Error */
Error_Handler();
}
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = DISABLE;;//ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE; //DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc1.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) !=HAL_OK)
{
Error_Handler();
}
/**Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_5;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; //这里配置成差分方式
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADC_Start_DMA(&hadc1,
(uint32_t *)aADCxConvertedData,
ADC_CONVERTED_DATA_BUFFER_SIZE
) != HAL_OK)
{
Error_Handler();
}
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE END ADC1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_ADC_CLK_ENABLE();
/**ADC1 GPIO Configuration
PA0-CK_IN ------> ADC1_IN5
PA1 ------> ADC1_IN6
*/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Peripheral DMA init*/
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Request = DMA_REQUEST_0;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_MEDIUM;//DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
/* USER CODE BEGIN ADC1_MspInit 1 */
/* USER CODE END ADC1_MspInit 1 */
}
}DMA配置
void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}DMA中断
void DMA1_Channel1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
/* USER CODE END DMA1_Channel1_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_adc1);
/* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
/* USER CODE END DMA1_Channel1_IRQn 1 */
}现在,开发板可以工作在差分ADC了。确实是1片性价比很高的M4!
相关推荐:
NUCLEO-L432KC官方技术文档
STM32 L4系列超低功耗微控制器官方介绍
STM32L4单片机参考设计
STM32单片机官方开发工具一览
评测3:可编程增益运放PGA
STM32L432的一个亮点就是内置了PGA模块(可编程增益运放),有机会接触这款芯片,当然要亲身体验一下这个新功能的特性:1、 DMA提供采样信号(正弦波)给DAC。2、 DAC模块产生一个正弦波信号DAC_OUT1(PA4)供OPAMP1放大。3、OPAMP1放大输出在PA3,增益为2或4。4、OPAMP增益动态改变而OPAMP启用。5、使用OPAMP正常和低功率模式(采样保持模式)。6、OPAMP的低功率模式(DAC)也可以使用Cortex内核保持在睡眠模式。7、Cortex内核可以被设置成睡眠模式没有DMA中断处理。测试步骤:1、示波器一个测试笔连接到CN4的PA4(A3-DAC_OUT1 引脚),显示生成的DAC正弦波信号(800mVp-p)。(DACouptut = OPAMP输入)。2、示波器另一个测试笔连接连接到CN4的PA3(A2-OPAMP_OUT1)引脚,显示OPAMP输出波形。3、PB0配置成下降沿中断的输入开关,短接到地时用于演示功能步骤的切换。4、编译下载STM32Cube_FW_L4_V1.5.0\Projects\STM32L432KC-Nucleo\Examples\OPAMP\OPAMP_PGA工程,示波器显示DAC_OUT1和OPAMP输出波形,对地短路PB0,可以有4种演示模式: -The tests steps are: - Step 0: DAC: normal power mode OPAMP: normal power mode - gain = 2 DMA: circular mode - DMA half transfer IThandled by Cortex Cortex:run mode - Step 1: DAC: normal power mode OPAMP: normal power mode - gain = 4 DMA: circular mode - DMA half transfer IThandled by Cortex Cortex:run mode - Step 2: DAC: Low power mode OPAMP: normal power mode - gain = 4 DMA: circular mode - DMA half transfer - no IThandled by Cortex Cortex:run mode - Step 3: DAC: Low power mode OPAMP: Low power mode - gain = 4 DMA: circular mode - DMA half transfer - no IThandled by Cortex Cortex:sleep mode - Step 4: DAC: Low power mode OPAMP: Low power mode - gain = 2 DMA: circular mode - DMA half transfer - no IThandled by Cortex Cortex:sleep mode 图1增益=2 图2 增益=4可以看出,运放输出底部还是有点失真了。
值得一提的是,OPAMP_PGA工程里产生正弦波的数据表数组里的数据有误,不能得到正确的正弦波波形,请按照下面修改:const uint16_t Sine12bit ={0,9,38,86,149,227,315,411, 511,611,707,796,847,937,984,1014, 1023,1014,984,937,847,796,707,611, 511,411,315,227,149,86,38,9};通过本次实验,体会了STM32L432PGA的灵活性和方便性,
https://www.stmcu.org.cn/module/forum/static/image/hrline/1.gif
相关推荐:
STM32 L4系列超低功耗微控制器官方介绍
NUCLEO-L432KC官方技术文档
STM32L4单片机参考设计
STM32单片机官方开发工具一览
STM32L432 Nucleo开发板评测(2)初试STM32L432
首先为MDK5下载并安装STM32L432驱动Keil.STM32L4xx.DFP.1.2.0.pack 接着下载并解压stm32cubel4.zip打开STM32Cube_FW_L4_V1.5.0\Projects\STM32L432KC-Nucleo\Examples\GPIO\GPIO_IOToggle工程。 器件选项中STM32L432KC已经被选中 点击Debug选项中选中ST-Link Debugger->SettingsST-LINK/V2-1激活,在SW Device Name栏可以看到 ARM CreSightSW-DP已被识别。 点击Utilities确定 器件的256KB Flash 至此,STM32L432KC编译环境已经建立。编译、下载GPIO_IOToggle,这个演示工程点亮PB3所驱动的LD3,现在绿色LED闪烁亮起。下载过程发现每当更换一个新工程编译后,都要再点击一下Debugger->Settings,才能下载,否则就报错。不知何故。
:loveliness::loveliness: 学习了 很详细!:):):) 内容很多,痕详细 增益只能配置2或者4范围有点小啊 wu1169668869 发表于 2016-8-2 19:31
增益只能配置2或者4范围有点小啊
毕竟是低功耗,功率放大不是长项。