你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 10892|回复: 22

[STM32L432] STM32L432 Nucleo开发板评测(4)差分ADC

  [复制链接]

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
发表于 2016-7-18 21:15:35 | 显示全部楼层 |阅读模式
本帖最后由 wenyangzeng 于 2017-1-3 13:41 编辑

STM32L432 Nucleo开发板评测(1

评测2:初试STM32L432    :   (4楼)

评测3:可编程增益运放PGA:(5楼)

评测(4)差分ADC              (6楼)

      有幸收到ST社区寄来ST公司最新推出的STM32L432Nucleo开发板进行评测。
    开发板的包装继承ST系列开发板包装风格:

STM32L432.JPG

图1 STM32L432 Nucleo开发板
主芯片是M4系列
ATM32L432KCU632PINS
ARM Cortex-M480MHZ
256-KB Flash,64-KBSRAM
Extensionconnectors:Arduino Nano
EmbeddedST-LINK/V2-1 debugger/Programmer
Mbed-enabled

正面.JPG
  正面STM32L432KBU6


背面.JPG
    背面 STLINK/V2-1

IMG_1275.JPG
  内包装印刷将这个芯片在开发板上的引脚顺序都标出来,方便使用

     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:

STM32L432的MDK5驱动:
下载这个软件包有点类似打热线电话一样,要看你的运气了。
      STM32L432 Nucleo开发板的评测心得今后将逐一与大家分享。
(待续)










回复

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2016-7-20 21:52:59 | 显示全部楼层
评测(4)差分ADC
  打开STM32CublMX,准备对ADC_IN5(PA0)进行ADC配置:
DIFFERENTIAL.jpg
配置过程中发现STM32L432的ADC具有差分ADC功能(图中蓝色方框),ADC差分方式能大大提高ADC转换结果的信噪比。在这颗小小的芯片上居然集成了差分ADC,实在太难得了。
当ADC_IN5配置成差分ADC输入时,ADC_IN6(PA1)自动配对成反相差分输入,差分运放与STM32L432简化连接见下图:

OPA.jpg
同时为ADC配置了DMA。
  1. ADC配置
  2. #include "adc.h"
  3. #include "gpio.h"
  4. #include "dma.h"
  5. /* USER CODE BEGIN 0 */
  6. #define ADC_CONVERTED_DATA_BUFFER_SIZE   ((uint32_t)  64)
  7. extern uint16_t   aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];
  8. /* USER CODE END 0 */

  9. ADC_HandleTypeDef hadc1;
  10. DMA_HandleTypeDef hdma_adc1;

  11. /* ADC1 init function */
  12. void MX_ADC1_Init(void)
  13. {
  14.   ADC_ChannelConfTypeDef sConfig;

  15.     /**Common config
  16.     */
  17.   hadc1.Instance = ADC1;
  18.          if (HAL_ADC_DeInit(&hadc1) != HAL_OK)
  19.   {
  20.     /* ADC de-initialization Error */
  21.     Error_Handler();
  22.   }
  23.   hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  24.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  25.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  26.   hadc1.Init.ScanConvMode = DISABLE;;//ADC_SCAN_DISABLE;
  27.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  28.   hadc1.Init.LowPowerAutoWait = DISABLE;
  29.   hadc1.Init.ContinuousConvMode = ENABLE; //DISABLE;
  30.   hadc1.Init.NbrOfConversion = 1;
  31.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  32.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  33.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  34.   hadc1.Init.DMAContinuousRequests = ENABLE;
  35.   hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  36.   hadc1.Init.OversamplingMode = DISABLE;
  37.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  38.   {
  39.     Error_Handler();
  40.   }
  41. if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) !=  HAL_OK)
  42.   {
  43.     Error_Handler();
  44.   }
  45.     /**Configure Regular Channel
  46.     */
  47.   sConfig.Channel = ADC_CHANNEL_5;
  48.   sConfig.Rank = 1;
  49.   sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  50.   sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED;               //这里配置成差分方式
  51.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  52.   sConfig.Offset = 0;
  53.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  54.   {
  55.     Error_Handler();
  56.   }
  57. if (HAL_ADC_Start_DMA(&hadc1,
  58.                         (uint32_t *)aADCxConvertedData,
  59.                         ADC_CONVERTED_DATA_BUFFER_SIZE
  60.                        ) != HAL_OK)
  61.   {
  62.     Error_Handler();
  63.   }
  64. }

  65. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  66. {

  67.   GPIO_InitTypeDef GPIO_InitStruct;
  68.   if(adcHandle->Instance==ADC1)
  69.   {
  70.   /* USER CODE BEGIN ADC1_MspInit 0 */

  71.   /* USER CODE END ADC1_MspInit 0 */
  72.     /* Peripheral clock enable */
  73.     __HAL_RCC_ADC_CLK_ENABLE();
  74.   
  75.     /**ADC1 GPIO Configuration   
  76.     PA0-CK_IN     ------> ADC1_IN5
  77.     PA1     ------> ADC1_IN6
  78.     */
  79.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  80.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
  81.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  82.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  83.     /* Peripheral DMA init*/
  84.   
  85.     hdma_adc1.Instance = DMA1_Channel1;
  86.     hdma_adc1.Init.Request = DMA_REQUEST_0;
  87.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  88.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  89.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  90.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  91.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  92.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
  93.     hdma_adc1.Init.Priority = DMA_PRIORITY_MEDIUM;//DMA_PRIORITY_LOW;
  94.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  95.     {
  96.       Error_Handler();
  97.     }

  98.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  99.   /* USER CODE BEGIN ADC1_MspInit 1 */

  100.   /* USER CODE END ADC1_MspInit 1 */
  101.   }
  102. }
复制代码
  1. DMA配置
  2. void MX_DMA_Init(void)
  3. {
  4.   /* DMA controller clock enable */
  5.   __HAL_RCC_DMA1_CLK_ENABLE();

  6.   /* DMA interrupt init */
  7.   /* DMA1_Channel1_IRQn interrupt configuration */
  8.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
  9.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

  10. }
复制代码
  1. DMA中断
  2. void DMA1_Channel1_IRQHandler(void)
  3. {
  4.   /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */

  5.   /* USER CODE END DMA1_Channel1_IRQn 0 */
  6.   HAL_DMA_IRQHandler(&hdma_adc1);
  7.   /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */

  8.   /* USER CODE END DMA1_Channel1_IRQn 1 */
  9. }
复制代码
现在,开发板可以工作在差分ADC了。确实是1片性价比很高的M4!

adc.jpg



相关推荐:

NUCLEO-L432KC官方技术文档

STM32 L4系列超低功耗微控制器官方介绍

STM32L4单片机参考设计

STM32单片机官方开发工具一览

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

回复 支持 2 反对 0

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2016-7-19 21:42:12 | 显示全部楼层
评测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_OUT1OPAMP输出波形,对地短路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
IMG_1276.JPG
1  增益=2
IMG_1277.JPG
2 增益=4  可以看出,运放输出底部还是有点失真了。

    值得一提的是,OPAMP_PGA工程里产生正弦波的数据表数组里的数据有误,不能得到正确的正弦波波形,请按照下面修改:
const uint16_t Sine12bit[32] ={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的灵活性和方便性,




相关推荐:
STM32 L4系列超低功耗微控制器官方介绍

NUCLEO-L432KC官方技术文档

STM32L4单片机参考设计

STM32单片机官方开发工具一览
回复 支持 1 反对 0

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2016-7-19 15:55:16 | 显示全部楼层
STM32L432 Nucleo开发板评测(2)初试STM32L432

首先为MDK5下载并安装STM32L432驱动Keil.STM32L4xx.DFP.1.2.0.pack
STM32L4xx.DFP.1.2.0.pack.jpg
接着下载并解压stm32cubel4.zip
打开STM32Cube_FW_L4_V1.5.0\Projects\STM32L432KC-Nucleo\Examples\GPIO\GPIO_IOToggle工程。
MDK5.jpg
器件选项中STM32L432KC已经被选中
ST-LINK.jpg
点击Debug选项中选中ST-Link Debugger->Settings
ST-LINK/V2-1激活,在SW Device Name栏可以看到 ARM CreSightSW-DP已被识别。
UTILITES.jpg
点击Utilities确定 器件的256KB Flash
至此,STM32L432KC编译环境已经建立。
编译、下载GPIO_IOToggle,这个演示工程点亮PB3所驱动的LD3,现在绿色LED闪烁亮起。
下载过程发现每当更换一个新工程编译后,都要再点击一下Debugger->Settings,才能下载,否则就报错。不知何故。

回复 支持 1 反对 0

使用道具 举报

13

主题

19

回帖

0

蝴蝶豆

初级会员

最后登录
2020-2-18
发表于 2016-7-18 21:40:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

33

回帖

0

蝴蝶豆

中级会员

最后登录
2019-12-4
发表于 2016-7-19 14:42:23 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

29

主题

290

回帖

15

蝴蝶豆

论坛元老

最后登录
2020-12-3
发表于 2016-7-21 07:53:07 | 显示全部楼层
很详细!
回复 支持 反对

使用道具 举报

9

主题

18

回帖

0

蝴蝶豆

初级会员

最后登录
2020-2-26
发表于 2016-7-25 17:38:22 | 显示全部楼层
内容很多,痕详细
回复 支持 反对

使用道具 举报

14

主题

1066

回帖

2

蝴蝶豆

金牌会员

最后登录
2019-1-10
发表于 2016-8-2 19:31:50 | 显示全部楼层
增益只能配置2或者4范围有点小啊
回复 支持 反对

使用道具 举报

74

主题

1368

回帖

194

蝴蝶豆

版主

最后登录
2020-5-12
发表于 2016-8-3 10:09:06 | 显示全部楼层
wu1169668869 发表于 2016-8-2 19:31
增益只能配置2或者4范围有点小啊

毕竟是低功耗,  功率放大不是长项。
回复 支持 反对

使用道具 举报

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版