X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
微控制器 MCU
[资料分享] MSP430F5438 ADC12学习笔记
Aguilera
2017-6-29 21:31
楼主
1.前言
这几天实践了MSP430的ADC12功能,虽然片内AD功能比较简单但是还学出了点“门道”来,这个“门道”便是MSP430F5438A和MSP430F5438的区别。这里通过一个例子说明片内ADC的使用,首先实现UART和定时器1S溢出的功能,在上述功能的基础上每1S打印一次AD转换结果,转换通道定向到通道11,该通道对应AVCC和AVSS插值的一半,由于AVCC和LDO的输出之间只有一个电感连接,可以理解转换的结果为LDO输出电压的一般,若扩大两倍便是LDO的实际输出结果,在本文所用的开发板LDO输出为3.3V,所有打印的结果越接近3.3V越好。
2.代码实现和输出结果
代码实现
// 时钟默认情况
// FLL时钟 FLL选择 XT1
// 辅助时钟 ACLK选择 XT1 32768Hz
// 主系统时钟 MCLK选择 DCOCLKDIV 8000000Hz
// 子系统时钟 SMCLK选择 DCOCLKDIV 8000000Hz
// TA1选择ACLK,最大计数值为32768,中断频率为1HZ
#include
#include
#include
void clock_config(void);
void select_xt1(void);
void dco_config(void);
void adc12_config(void);
void uart_config(void);
char second_flag = 0; // 1S标志
int main(void)
{
clock_config(); // 初始化时钟
adc12_config(); // 初始化ADC12
uart_config();
TA1CCTL0 = CCIE; // 使能TA1CCR0,比较匹配中断
TA1CCR0 = 32768; // 初始化最大值,发生比较匹配中断频率 32768/32768 = 1Hz
TA1CTL = TASSEL_1 + MC_1 + TACLR; // 选择ACLK,最大值为CCR0,清除计数值
_EINT(); // 初始化全局中断
while(1)
{
if( second_flag )
{
second_flag = 0; // 1s时间到
ADC12CTL0 |= ADC12SC; // 启动转换
while ( !(ADC12IFG & BIT0) ); // 等待转换完成
// 被转换的通道为通道11 (AVCC-AVSS)/2;
// 此时转换的精度为12位——4096
// AVCC通过一个电感和LDO的输出端连接
// 打印LDO输出电压,保留3位精度
float ldo_voltage = ADC12MEM0 / 4096.0 * 3.3 * 2;
printf("LDO Voltage %.3f\r\n",ldo_voltage);
}
}
}
void clock_config(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
select_xt1(); // 选择XT1
dco_config(); // ACLK = XT1 = 32.768K
// MCLK = SMCLK = 8000K
}
void select_xt1(void)
{
// 启动XT1
P7SEL |= 0x03; // P7.0 P7.1 外设功能
UCSCTL6 &= ~(XT1OFF); // XT1打开
UCSCTL6 |= XCAP_3; // 内部电容
do
{
UCSCTL7 &= ~XT1LFOFFG; // 清楚XT1错误标记
}while (UCSCTL7&XT1LFOFFG); // 检测XT1错误标记
}
void dco_config(void)
{
__bis_SR_register(SCG0); // 禁止FLL功能
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // DCO最大频率为16MHz
UCSCTL2 = FLLD_1 + 243; // 设置DCO频率为8MHz
// MCLK = SMCLK= Fdcoclkdiv = (N+1)X(Ffllrefclk/n)
// N为唯一需要计算的值
// Ffllrefclk FLL参考时钟,默认为XT1
// n取默认值,此时为1
// (243 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); // 使能FLL功能
// 必要延时
__delay_cycles(250000);
// 清楚错误标志位
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// 清除所有振荡器错误标志位
SFRIFG1 &= ~OFIFG; // 清除振荡器错误
}while (SFRIFG1&OFIFG); // 等待清楚完成
}
void adc12_config(void)
{
// 只有在ADC12ENC复位的情况下才可以操作
// ADC12SHT1X ADC12SHT0X ADC12MSC ADC12REF2_5V ADC12REFON ADC12ON
ADC12CTL0 &= ~ADC12ENC;
// 设置采样保持时间,最大时间周期以提高转换精度
// 注意MSP430F5438没有REF模块,片内基准无效
// 操作ADC12REF2_5V ,ADC12REFON并无意义
ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON;
// ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON +
// ADC12REF2_5V + ADC12REFON;
// 采样保持脉冲来自采样定时器
ADC12CTL1 = ADC12SHP;
// 关闭内部内部温度检测以降低功耗,注意或操作否则修改转换精度
ADC12CTL2 |= ADC12TCOFF ;
// 基准电压选择AVCC,并选择11通道——(AVCC-AVSS)/2
ADC12MCTL0 = ADC12SREF_0 + ADC12INCH_11;
__delay_cycles(75);
// ADC12使能
ADC12CTL0 |= ADC12ENC;
}
void uart_config(void)
{
P3SEL = 0x30; // 选择P3.4和P3.5的复用功能
UCA0CTL1 |= UCSWRST; // 软件复位
UCA0CTL1 |= UCSSEL_1; // 选择ACLK时钟
UCA0BR0 = 3; // 查表获得
UCA0BR1 = 0; // UCA0BRX和UCA0MCTL数值
UCA0MCTL |= UCBRS_3 + UCBRF_0; //
UCA0CTL1 &= ~UCSWRST; //
UCA0IE |= UCRXIE; // 使能接收中断
}
int putchar(int ch)
{
UCA0TXBUF = ch;
while(!(UCA0IFG & UCTXIFG));
return ch;
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
second_flag = 1;
}
本帖最后由 Aguilera 于 2017-6-29 21:37 编辑
点赞
回复评论
暂无评论,赶紧抢沙发吧
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
怎样在通信的时候怎么实现奇偶校验啊?
双十一抢的拇指板Nucleo-STM32L011快速上手,移植自制小型调度MOE
超详细的小车设计
linux网络编程
DPS技术为视频分析技术带来新的应用空间
分享一款自动LED应急灯电路
SD卡封装
磁悬浮玩具! MEGA168
分享一篇文章:ADI实验室电路是怎样炼成的?
有誰能介紹一下各系列的 ARM 呢?
讨论一个PWM转0-20mA电路
关于高频占空比可调PWM
usb cdc devcie
Matlab图像处理应用文集
求WIN CE开发的小程序源码
电子设计与制作大赛模拟试题——液位控制器
MSP430激光安全系统
IAR中的“Segment NEAR_I”大小设置?
开关电源的有关问题
FPGA经典100问之<仿真 20问>.pdf
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复