查看: 540|回复: 0
打印 上一主题 下一主题

【MSP430F149学习】23 数模转换

[复制链接] qrcode

32

主题

63

帖子

163

积分

注册会员

Rank: 2

积分
163
楼主
跳转到指定楼层
发表于 2015-12-17 05:07 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


【MSP430F149学习】23 数模转换



准备工具:电脑;TS8900--MSP430F149开发板;LCD1602屏;USB线一根

开发环境:IAR EW for MSP430 V5.30



用ADC采样DAC输出的模拟电压数据,将两个模拟电压值在1602液晶上显示,通过按键可调节输出电压。



原理图



硬件图



部分程序代码


uint    ADC_tmp[16];      //存放ADC数值的缓冲区
uchar   cnt = 0;          //计数变量
uint    ADC_Val = 0;      //一次ADC转换的平均值
uchar   DAC_Val;          //DAC输出数据

uchar shuzi[] = {"0123456789."};
uchar tishi1[] = {"DAC volt: "};
uchar tishi2[] = {"ADC volt: "};
void Init_ADC(void);
uchar Write_DAC(uchar wdata);
void Trans_val(uint Hex_Val,uchar n);

/****************主函数****************/
void main(void)
{
    
    WDTCTL = WDTPW + WDTHOLD;   //停止看门狗
    P6DIR |= BIT26OUT |= BIT2;  //关闭电平转换
    P6DIR |= BIT76OUT |= BIT7;  //关闭蜂鸣器
    P6DIR |= BIT36OUT |= BIT3;  //开液晶背光
    P1DIR |= 0x03 + BIT7;       //设置DAC的控制IO为输出状态
    P1OUT  = 0x03;
    P1IE  |= BIT2 + BIT3;       //允许P1.2和P1.3中断
    
    LcdReset();
    DispNChar(0,0,10,tishi1);   //显示提示文字
    Disp1Char(15,0,0x56);       //0x56是字符V的ASCII码值       
    DispNChar(0,1,10,tishi2);
    Disp1Char(15,1,0x56);
    
    DAC_Val = 0;
    Write_DAC(DAC_Val);
    Trans_val(DAC_Val,8);
    
    Init_ADC();
    _EINT();
    while(1)
    {       
        ADC12CTL0 |= ADC12SC;           //开始一次转换
        LPM0;
        Trans_val(ADC_Val,12);          //在液晶上提示
    }
}
/*******************************************
函数名称:ADC12_ISR
功    能:ADC的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR(void)
{   
    ADC_tmp[cnt++] = ADC12MEM0;
    
    if(cnt == 16)
    {
        unsigned long ADC_sum = 0;
        uchar i;
        
        for(i = 0;i < 16;i++)           //求16次采样的均值
            ADC_sum += ADC_tmp;
        
        ADC_Val = ADC_sum >> 4;        
        cnt = 0;
        LPM0_EXIT;
    }
    else
    {
        ADC12CTL0 |= ADC12SC;           //开始一次转换
    }
}
/*******************************************
函数名称:Port1_ISR
功    能:端口P1的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
    
    _DINT();
    
    if(P1IFG & BIT2)
    {
        P1IFG = 0x00;           //清中断标志 
        DAC_Val -= 10;          //DAC的输出减少10个偏置量
        Write_DAC(DAC_Val);     //写入DAC
        Trans_val(DAC_Val,8);   //在液晶上提示
    }
    else if(P1IFG & BIT3)
    {
        P1IFG = 0x00;           //清中断标志
        DAC_Val += 10;          //DAC的输出增加10个偏置量
        Write_DAC(DAC_Val);     //写入DAC
        Trans_val(DAC_Val,8);   //在液晶上提示
    }
    else
        _NOP();
    
    P1IFG = 0x00;           //清中断标志
    _EINT();
}

/*******************************************
函数名称:Init_ADC
功    能:初始化ADC寄存器
参    数:无
返回值  :无
********************************************/
void Init_ADC(void)    
{
    P6SEL |= BIT1;                  //P6.1选做ADC输入端口
    ADC12CTL0 = SHT0_2 + ADC12ON;   //设置采样时间,打开ADC
    ADC12CTL1 = SHP;                //使用采样定时器,选择SMCLK
    ADC12IE = BIT0;                 //使能采样中断
    ADC12MCTL0 = INCH_1;            //选择采样通道1
    ADC12CTL0 |= ENC;               //打开转换使能
}
/*******************************************
函数名称:Write_DAC
功    能:向DAC中写入输出电压数据
参    数:无
返回值  :写入结果:1--成功,0--失败
********************************************/
uchar Write_DAC(uchar wdata)
{
    start();
	write1byte(0x98);   //DAC的设备地址
	if(check())   write1byte(wdata >> 4);   //写控制模式和电压数据的高四位
	else          return 0;
	if(check())   write1byte(wdata << 4);  //写电压数据的低四位
	else          return 0;
	if(check())	  stop();
	else          return 0;
	return 1;    
}
/*******************************************
函数名称:Trans_val
功    能:将16进制数据变换成三位10进制数据,
          并在液晶上显示
参    数:Hex_Val--16进制数据
          n--变换时的分母等于2的n次方       
返回值  :写入结果:1--成功,0--失败
********************************************/
void Trans_val(uint Hex_Val,uchar n)
{
    unsigned long caltmp;
    uint Curr_Volt;
    uchar t1,i;
    uchar ptr[4];
    
    caltmp = Hex_Val;
    caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 33
    caltmp = (caltmp << 3) + (caltmp << 1);     //caltmp = caltmp * 10
    Curr_Volt = caltmp >> n;                    //Curr_Volt = caltmp / 2^n
    ptr[0] = Curr_Volt / 100;                   //Hex->Dec变换
    t1 = Curr_Volt - (ptr[0] * 100);
    ptr[2] = t1 / 10;
    ptr[3] = t1 - (ptr[2] * 10);
    if(n == 8)          //如果是DAC的数据
        t1 = 0;
    else                //如果是ADC的数据
        t1 = 1;
    
    ptr[1] = 10;            //shuzi表中第10位对应符号"."
    _DINT();
    //在液晶上显示变换后的结果
    for(i = 0;i < 4;i++)
      Disp1Char((10 + i),t1,shuzi[ptr]);
    _EINT();
}




下载运行效果



按动K19键可以减小DAC的输出电压,按动K20键可以增加DAC的输出电压。




IAR工程



【MSP430F149学习】汇总贴



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表