使用的MSP430型号为MSP430F5529LP(Lauchpad)

MSP430x5xx and MSP430x6xx Family User's Guide 给出:其内置12位ADC的最高采样率约为200ksps

下面详述ADC设置过程。

目录

1.设置ADC转换模式为Repeat-single-channel;

2.设置ADC的转换时钟sample-and-hold source (SHI)

3.设置定时器A为输出输出模式

4.设置输入通道

5.设置ADC12SHP位

6.设置采样保持时间


1.设置ADC转换模式为Repeat-single-channel;

请通过设置ADC12CONSEQx位来设置转换模式。

2.设置ADC的转换时钟sample-and-hold source (SHI)

选择为定时器A的输出;

对于ADC12SHSx位, 默认值为0h,也就是ADC12SC位控制一次转换或多次转换的开始。在这一点上,官网上给出的大部分例程都保持默认设置。比如:

https://dev.ti.com/tirex/explore/node?devices=MSP430F5529&node=ALGZRALuAjj-L1sgzhrl-Q__IOGqZri__LATEST

本例程中需要选择定时器输出控制转换的开始, MSP430x5xx and MSP430x6xx Family User's Guide 中告诉我们需要查找device-specific data sheet

在这一点上,MSP430G2553 的ADC10的寄存器说明中则直接给出了对应的定时器:

下图摘自 MSP430x2xx Family  User's Guide

对于F5529的ADC12,我们在 MSP430F552x, MSP430F551x Mixed-Signal Microcontrollers 中可以找到答案:

这样,设置ADC12SHS位为ADC12SHS_1,就可以通过TA0.1输出一个PWM波控制ADC转换。

注意,由于使用了TimerA控制转换,我们就不再需要控制ADC12SC位来开启转换。

也就是说官网示例中的以下语句我们不需要。

 ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion

同理,官网的给出的单通道重复转换的另一个示例中:

https://dev.ti.com/tirex/explore/node?devices=MSP430F5529&node=AF4y3ALvJIfHLG8i78B81g__IOGqZri__LATESThttps://dev.ti.com/tirex/explore/node?devices=MSP430F5529&node=AF4y3ALvJIfHLG8i78B81g__IOGqZri__LATEST

 ADC12MSC位的设置我们也不再需要,因为我们是通过定时器输出的PWM波来控制转换的,ADC12MSC位被设置为1时,得到一个数据后,下一个数据将会被立即转换,并不受PWM波的控制。(见下)

3.设置定时器A为输出输出模式

TA0.1输出应为周期为200kHz的PWM波。

这里选择Output Mode 3,输出PWM波的周期只受TAxCCR0控制。

如果你的MSP430SMCLK为8MHz,且SMCLK被选为定时器的时钟源,那么TAxCCR0应该为:

TAxCCR1的值将只影响占空比。

选择其他的输出模式请根据实际进行设置。

4.设置输入通道

上图来自:

MSP430F5529 LaunchPad™ Development Kit  (MSPEXP430F5529LP) 
slau533d.pdf
上图仍然来自:MSP430F552x, MSP430F551x Mixed-Signal Microcontrollers

这里选择P6.0作为ADC输入引脚。

5.设置ADC12SHP位

该位控制采样的模式。

Extended Sample Mode:

Pulse Sample Mode:

这里的理解为:SHI(已经被我们设置为定时器的输入)控制采样和转换时序。

对于 Extended Sample Mode,采样时长将与其高电平时间保持一致,这样在某些情况下可能导致转换出错。

比如,每次采样间隔完全足够完成一次转换,但由于低电平时间过短(比如占空比为99%),t_convert短于13个ADC12CLK,转换就会出错。

对于Pulse Sample Mode,SHI的上升沿触发采样开始,但采样时长由ADC12SHT位控制(见下一部分)

6.设置采样保持时间

由于需要达到最高转换速率,这里的设置需要异常谨慎。

下面稍作分析。

上图仍然来自:MSP430F552x, MSP430F551x Mixed-Signal Microcontrollers

上图来自:MSP430x5xx and MSP430x6xx Family User's Guide

ADC12 clock source默认值为0,即ADC12OSC,其频率范围为:4.2~5.4MHz。

这里估算时按5MHz算,则其周期为:1/5M=200ns=0.2us

而我们需要达到的转换速率为200kHz,即每5us开始一次新的采样转换。

假如我们设置ADC12SHT0x位为0010b,也就是采样时间为16个ADC12CLK,则至少需要16*0.2=3.2us进行采样。

同时在当前配置下,t_convert的最小值为2.4us,那么:

无法完成任务。这里测试的情况是采样点数不够。

所以只能设置ADC12SHT0x为0001b或0000b,其他值统统不行。

另一种解决方案,通过设置ADC12SSELx位将时钟源换为SMCLK,并将主频调成25MHz(需要进行升压操作,详见PMM模块说明,这里不多说,进而实现要求.

当然当你主频过高时,不要忘记采样时间也有要求,需要大于1000ns,否则也可能出问题。

下面贴完整代码:

#include <Clock_init.h>
/*** main.c*/
unsigned int i=0;
volatile unsigned int buf[200];
int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop WDTClock_init();Timer_Init();ADC12_Init();
}#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{switch(__even_in_range(ADC12IV,34)){case  0: break;                           // Vector  0:  No interruptcase  2: break;                           // Vector  2:  ADC overflowcase  4: break;                           // Vector  4:  ADC timing overflowcase  6:                                  // Vector  6:  ADC12IFG0buf[i]=ADC12MEM0;//*3.3/4096.0; 变成浮点数将会来不及采样i++;if(i>200) i=0;break;case  8: break;                           // Vector  8:  ADC12IFG1case 10: break;                           // Vector 10:  ADC12IFG2case 12: break;                           // Vector 12:  ADC12IFG3case 14: break;                           // Vector 14:  ADC12IFG4case 16: break;                           // Vector 16:  ADC12IFG5case 18: break;                           // Vector 18:  ADC12IFG6case 20: break;                           // Vector 20:  ADC12IFG7case 22: break;                           // Vector 22:  ADC12IFG8case 24: break;                           // Vector 24:  ADC12IFG9case 26: break;                           // Vector 26:  ADC12IFG10case 28: break;                           // Vector 28:  ADC12IFG11case 30: break;                           // Vector 30:  ADC12IFG12case 32: break;                           // Vector 32:  ADC12IFG13case 34: break;                           // Vector 34:  ADC12IFG14default: break;}
}

系统频率设置为25MHz (需要设置PMM升压)

void upVcc(void)//核心电压上升3级
{PMMCTL0_H = PMMPW_H;                      //开启PMM电源管理,即开锁SVSMLCTL |= SVSMLRRL_1 + SVMLE;        //配置SVML电压PMMCTL0 = PMMPW +PMMCOREV_3;           //配置内核电压,选择3级while((PMMIFG & SVSMLDLYIFG)==0);      //等待配置完成PMMIFG &=~ (SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);if((PMMIFG & SVMLIFG)==1)while((PMMIFG & SVMLVLRIFG)==0);SVSMLCTL &=~ SVMLE;                    //关闭SVMLPMMCTL0_H = 0x00;                     //锁存配置,即关锁
}void Clock_init()         //XT2为时钟源
{upVcc();P5SEL |= BIT2+BIT3;                       // Port select XT2UCSCTL6 &= ~XT2OFF;                       // Enable XT2UCSCTL3 |= SELREF_5+FLLREFDIV_2;                      // FLLref = XT2 4MHz  divider:4// Since LFXT1 is not used,// sourcing FLL with LFXT1 can cause// XT1OFFG flag to setUCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCOUCSCTL2 = FLLD_1 + 24; //N=24         SMCLK=MCLK=DCOclkdiv:(N+1)*FFLrefclk/4=25MHz  FFLD=1—>D=2为默认值 -> DCOclk=50MHzUCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODxUCSCTL1 = DCORSEL_7;                      // Set RSELx for DCO = 16 MHz// Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settlesdo{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);// Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~OFIFG;                      // Clear fault flags}while (SFRIFG1&OFIFG);                   // Test oscillator fault flagUCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to// expected frequency 4MHz}

ADC12初始化:

void ADC12_Init()
{P6SEL |= BIT0;                            // Enable A/D channel A0ADC12CTL0 = ADC12SHT0_1 + ADC12ON;ADC12CTL1= ADC12SHP + ADC12CONSEQ_2 + ADC12SHS_1;  //SHS1: TimerA 0_1 output ADC source clk:SMLCKADC12MCTL0 = ADC12INCH_0; //Channel 0ADC12IE=0x01; //Enable interruptADC12CTL0 |= ADC12ENC;__bis_SR_register(GIE);       // Enter LPM0, Enable interrupts
}

定时器设置:

void Timer_Init()
{P1DIR |= BIT2;  //Set p1.2 as TimerA outputP1SEL |= BIT2;TA0CTL= TASSEL_2 + MC_1 + TACLR;TA0CCTL1=OUTMOD_3;
//    CCTL1=CCIE;  // Don't need Timer interrupt hereTA0CCR0=125; //T=5usTA0CCR1=62;  // Set the duty. Can be any value in this project}

结果:

输入10kHz正弦波测试,每周期应该采样得到20个数据点。

TimerA的PWM波从P1.2输出:

补充DMA操作:

#include <msp430.h>
#include <stdint.h>extern unsigned int buf[200];void DMA_Init()
{// Setup DMA0DMACTL0 = DMA0TSEL_24;                    // ADC12IFGx triggeredDMACTL4 = DMARMWDIS;                      // Read-modify-write disable
//    DMA0CTL &= ~DMAIFG;DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMASRCINCR_0; // Rpt single tranferDMA0SZ = 200;                               // DMA0 size = 200__data20_write_long((uintptr_t) &DMA0SA,(uintptr_t) &ADC12MEM0);// Source block address DMA将存储ADC数据__data20_write_long((uintptr_t) &DMA0DA,(uintptr_t) &buf);// Destination single address数据存至buf数组中__bis_SR_register(LPM0_bits + GIE);      __no_operation();                         // used for debugging
}

MSP430 ADC12 最高采样率测试相关推荐

  1. MSP430 F5529 单片机 串口 测试 调试

    相应还有MSP430G2553单片机的:https://blog.csdn.net/x1131230123/article/details/109544616 MSP430F5529 单片机 ,初始化 ...

  2. PCIe 5.0 规范最新更新及PCIe 5.0测试挑战​

    PCIe 5.0 基础规范 v1.0 在 2019 年年中发布以后,Synopsys 发布了世界上第一款支持 PCIe 5.0 基础规范 v1.0 的 IP,并展示了在其实验室验证发射机/接收机 Tx ...

  3. 获取系统分辨率_一文弄懂高分辨率高速快门CMOS成像传感器技术应用现状

    CMOS图像传感器是如何一步步占领市场的?ams面扫描成像传感器高级应用工程师Pieterjan Daeleman认为机器视觉行业对图像传感器的高分辨率.高速率性能的要求,带给CMOS图像传感器无限机 ...

  4. Tinyos-2.1.1中各组件的分布总结(查询)表

    TinyOS相关组件路径 /opt/tinyos-2.1.1/tos/chips/ /opt/tinyos-2.1.1/tos/chips/ad5200 AD5200C.nc AD5200P.nc A ...

  5. 【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )

    文章目录 一.Oboe 输出测试参数面板 二.Oboe 输出测试参数 API 及 设备选择 三.Oboe 输出测试参数 音频参数 四.Oboe 输出测试参数 播放偏好 五.Oboe 输出测试参数 ( ...

  6. Msp430学习笔记—ADC12(一)

    编自CSX_锅! ADC12: 采样→保持→量化→编码 12 bits:200ksps(kilo samples per second) 逐次逼近法实现 analog to digital: ADC1 ...

  7. 基于 MSP430 CC1101的WOR的测试

    CC1101配合MSP430 测试正常. /****************************************************************************** ...

  8. 什么软件能测试触控采样率,苹果iPhone X触控采样率达120Hz,但不支持ProMotion

    我们曾经希望2017年的这三款iPhone都能够配备ProMotion技术,然而现实却令大家失望,因为在苹果给出的信息和规格中,并没有类似的描述.不过最近开发者们得到的新消息,倒是让一些人重新燃起了希 ...

  9. 什么软件能测试触控采样率,手机也能实现240Hz触控采样率?华为Mate40告诉你什么是好手机...

    2019年6月,工信部向三大通讯运营商正式发放了5G商用牌照,这意味着中国大陆终于开启了5G商用时代.相比4G网络,5G网络的一大亮点就是可做到万物互联,逐渐改变我们当下的生活方式. 最新一代5G手机 ...

  10. 【MSP430】MSP430F5529关于ADC12模数转换介绍

    以下资料大部分来源于<MSP430x5xx and MSP430x6xx Family User Guide> 一.ADC12_A模块介绍 1.12位ADC核心   ADC核心将模拟输入转 ...

最新文章

  1. 小程序订单点击不同页面_小程序跳转页面参数丢失
  2. C#中return语句的使用方法
  3. java怎样将多个list写入txt中并且不覆盖原有数据_java容器,面试必备知识点整理!...
  4. 前端常用60余种工具方法(下)
  5. 基于redis的简易分布式爬虫框架
  6. iPhone 11外壳保护套曝光:噢,这个浓厚的老干部风格
  7. mysql通过存储过程批量造测试数据
  8. 分布式消息中间件中的一些概念(接上一篇的《什么是分布式消息中间件?》)...
  9. 创建java类并实例化类对象
  10. 数据结构|-二叉查找树(二叉搜索树)的链式存储结构的实现
  11. media type
  12. TCP端口扫描[Python3.5]
  13. vs2013 旗舰版 密钥
  14. 卸载已有的navicat for mysql,安装破解版navicat for mysql
  15. 计算机系统组成复习及CRC循环冗余校验码计算
  16. win11电脑加密文件夹的两种方法
  17. Ethereum Yellow Paper
  18. C++模板偏特化和全特化
  19. 系列微课|《Python程序设计(第3版)》第4章
  20. word2019技巧:段落的段前段后单位行设置为磅

热门文章

  1. html js css 简明教程,Web前端开发简明教程(HTML+CSS+JavaScript+jQuery)
  2. python正则表达式提取字符串中的书名_使用python正则表达式从字符串中提取名称...
  3. 360校招笔试算法题
  4. 微信小程序自定义头部导航栏
  5. 基于JavaWeb聊天室设计与实现
  6. 对有序表进行折半查找的非递归算法
  7. python模拟点击下一页_Python使用selenium模拟点击,进入下一页(三)
  8. 使用quartz 定时任务
  9. UOJ 30 【CF Round #278】Tourists
  10. 基础呀基础,用二极管防止反接,你学会了吗?