打印

MSP430F249中ADC12应用的代码程序

[复制链接]
4401|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shenmulzb1985|  楼主 | 2012-5-9 15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该例程是利用249的P6.3/A3口来采集电池电压的,故其想换程序代码如下:
void ad_init()
{
  P6SEL = 0x08;
  ADC12CTL0 &= ~ENC; //使AD模块处于初始状态
  ADC12CTL0|=MSC+ADC12ON+SHT0_2+REF2_5V+REFON; //采样保持时间为16个ADC12CLK  
}
/****************************************************************************
设置转换模式
adr:转换的首地址。取值范围为0~15
mod:转换模式。0:单通道单次  1:序列通道单次  2:单通道多次  3:序列通道多次
****************************************************************************/
void AdcDo(unsigned int adr,unsigned char mod)
{
  ADC12CTL1 = (adr<<12)+SHP+(mod<<1);   //SHP表示由采样定时器控制采样
}
void ad_open(uint x)
{
  ad_flag =1;
  AdcDo(3,0);                   //开始转换的寄存器为ADC12MEM2
  ADC12CTL0 &= ~ENC;   
  ADC12MCTL3 = SREF_1 + x + 0x80;   // 参考电压选择,输入通道
  ADC12IE |=0x08;              //使能转换中断   
  ADC12CTL0 |= ENC;         //允许转换
  ADC12CTL0 |= ENC+ADC12SC; //转换开始  
}
//读取转换结果的底层程序:
uint ad_read()
{
   task_uart0.flag =0x01;   
    wdt_number =0;
    wdt_temp   =30;  
    inter_flag1 =0x01;
    TBCCTL0 |=CCIE;
  while(ad_flag)           //等待转换完 ,最长1.5s,若没转换完,直接跳过
  {
    if(task_uart0.flag ==0)
      ad_flag =0;
  }
  task_uart0.flag =0;   
  return ad_value;         
}
//关闭ADC模块底层程序:
void ad_close()
{
  ADC12CTL0 &= ~(ADC12ON+REFON);  //不允许转换
  ADC12CTL0 &= ~ENC;
}
#pragma  vector=ADC12_VECTOR
__interrupt  void ADC12ISR(void)
{
  ad_value=ADC12MEM3;//读取ADC值  
  ad_flag=0;
}

  unsigned int adc_voltage[11];                //主程序中调用上述采集子程序将采集的结果存入该RAM中
   for(char k=0;k<11;k++)
   {
     ad_open(3);                             
     wdt_time =0;     
     adc_voltage[k]=ad_read();
     for(int i=0;i<1000;i++);
   }
   ad_close();

注意,要改用其他端口采集的时候,一定要注意各个寄存器的配置

相关帖子

沙发
益友电子| | 2012-5-9 15:40 | 只看该作者
建议楼主能够使用定时器来启动ad采样这样就省事多了

使用特权

评论回复
板凳
firstblood| | 2012-5-10 17:37 | 只看该作者
看楼主的意思,当药用到其他端口采集数据的时候,能否把一些需要注意的相关的寄存器的给着重标出来额,谢谢

使用特权

评论回复
地板
vivilzb1985| | 2012-5-11 17:38 | 只看该作者
这代码的看似很完整的啊,下边的信号采集函数调用的就是简单了点啊

使用特权

评论回复
5
shenmulzb1985|  楼主 | 2012-5-16 16:24 | 只看该作者
unsigned int adc_voltage[11];                //主程序中调用上述采集子程序将采集的结果存入该RAM中
   for(char k=0;k<11;k++)
   {
     ad_open(3);                             
     wdt_time =0;     
     adc_voltage[k]=ad_read();
     for(int i=0;i<1000;i++);
   }
   ad_close();
各位大虾的,这个程序代码的主体调用就是这部分的,先open AD,采集完后再close AD,就比较省电了啊

使用特权

评论回复
6
shenmulzb1985|  楼主 | 2012-5-16 16:29 | 只看该作者
ADC12CTL1  ADC12MCTLx   ADC12IE  ADC12CTL0  ADC12MEMx 主要就涉及到这几个相关的寄存器,用其他端口采集信号的时候,注意涉及到的这几个寄存器加以改变就行了

使用特权

评论回复
7
firstblood| | 2012-5-17 13:44 | 只看该作者
谢谢楼主了啊,讲解的比较透彻的啊,明白了

使用特权

评论回复
8
shenmulzb1985|  楼主 | 2012-5-19 11:49 | 只看该作者
呵呵,各位大虾的,关于单片机内部的ADC的使用 的,我还是有些体会的,需要帮忙的话,可以帖子上呼我的啊

使用特权

评论回复
9
丨明天过后| | 2012-6-28 20:38 | 只看该作者
楼主,请问如何将转换得到的结果传输到USB接口,然后传到pc机上??(最近在做关于波形采集的硬件课设,求楼主给出相应的代码,用的是TUSB3410的接口)

使用特权

评论回复
10
丨明天过后| | 2012-6-28 20:59 | 只看该作者
求大神快点回复啊

使用特权

评论回复
11
丨明天过后| | 2012-6-28 21:00 | 只看该作者
求大神快点回复啊

使用特权

评论回复
12
vivilzb1985| | 2012-6-29 11:24 | 只看该作者
9楼的大虾,通过单片机采集转换后的数据为16进制的数据啊,该数据要想通过USB接口传输到PC机,请问你是否还需要设计下USB的硬件电路,是否还需要知道USB的通讯协议,把USB通讯这一块的也整清楚啊,关于USB通讯这一块的,我也没实际搞过,只进行过利用串口同PC机通讯,这个很方便的啊

使用特权

评论回复
13
丨明天过后| | 2012-6-29 14:04 | 只看该作者
回复12楼,这个我也不清楚耶,我只是个菜鸟,刚接触这个东西

使用特权

评论回复
14
rickygin1899| | 2014-5-8 09:24 | 只看该作者
请问楼主,如果采用定时器启动和中断的话,应该怎么改?

使用特权

评论回复
15
lanyuloveshi| | 2015-8-21 17:41 | 只看该作者
shenmulzb1985 发表于 2012-5-16 16:29
ADC12CTL1  ADC12MCTLx   ADC12IE  ADC12CTL0  ADC12MEMx 主要就涉及到这几个相关的寄存器,用其他端口采集 ...

楼主,亲人啊。我弄了好就得msp430f249的AD转换程序了。想用protues仿真。用1602显示,但是一直显示不出AD转换的数据。不知道原因啊,请问你用protuse仿真过吗?

使用特权

评论回复
16
Monkeywong| | 2018-4-23 17:13 | 只看该作者
shenmulzb1985 发表于 2012-5-19 11:49
呵呵,各位大虾的,关于单片机内部的ADC的使用 的,我还是有些体会的,需要帮忙的话,可以帖子上呼我的啊 ...

大神,最近在ADC12 序列多通道的程序上遇到了点麻烦,现只会单次单通道,序列多通道不太会修改程序?

使用特权

评论回复
17
dirtwillfly| | 2018-4-24 08:02 | 只看该作者
Monkeywong 发表于 2018-4-23 17:13
大神,最近在ADC12 序列多通道的程序上遇到了点麻烦,现只会单次单通道,序列多通道不太会修改程序? ...

官网有例程的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

440

帖子

1

粉丝