嵌入式ADC

一、使用ADS1.2平台设计程序,并具有以下功能:(40分)

要求:在Micro 2440 平台下实现,A/D转换后信号输入字符控制蜂鸣器发声及LED灯发光。

当扭动可调电阻阻值由小变大,得到变化的模拟输入量,控制LED1-LED4灯依次点亮并且蜂鸣器发生依次变得急促。

(汇编语言,C、汇编混合编程都可以)

 

     AREA XIE,CODE,READONLY 
  ENTRY 
      ldr r13, =0x1000 
     IMPORT Main 
      b Main 
     END










#define GPBDAT (*(volatile unsigned*)0x56000014)
#define GPBCON (*(volatile unsigned*)0x56000010)
#define GPBUP (*(volatile unsigned*)0x56000018)


#define rADCCON (*(volatile unsigned*)0x58000000)  
#define rADCDAT0 (*(volatile unsigned*)0x5800000C)// 数据转换寄存器


int read()
{
   rADCCON=(1<<14)|(19<<6)|(0<<3);
   rADCCON|=0X01;
   while(rADCCON&0X01);   
     // 0001  启动A/D转换,转换开始时自动变为0  
      //如果结果为0,结束循环  结果为不为0,在验证下一个条件 


   while(!(rADCCON&0X8000));  
      //结果为0,表示正在转换中 取反为真,
      //结果非0  表示转换结束   取反为假 最高位为转换位 0 转换中, 1转换结束
   return((int)rADCDAT0&0X3FF);//保证范围在0X3FF之间
  
}




void delay(int n)
{
    int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<1000;j++)
    j=j+0;
}


int Main()
{
   int a=0;
  
   GPBUP=0X00;
   GPBCON=0X15400;
   GPBCON|=0X01;


   while(1)
  {  a=read();
  GPBDAT=0XFFF;
     if(a<100)
       {  
          GPBDAT=0XFCF;;
          delay(10000);
          GPBDAT-=1;
          delay(10000);
        }
     if(a<500&&a>=100)
       {  
          GPBDAT=0XF8F;
       
          delay(7000);
          GPBDAT-=1;
          delay(7000);
        }
     if(a<1000&&a>=500)
       {  
          GPBDAT=0XF0F;
          
          delay(4000);
          GPBDAT-=1;
          delay(4000);
          
        }
    if(a>=1000)
       {  
          GPBDAT=0X00F;
          
          delay(1000);
          GPBDAT-=1;
          delay(1000);
        }
      
   }
}


//(temp&0x01)&&!(temp&(1<<16))
//这个是条件语句temp&0x01  变量temp和0x01按位与,
//          得到一个结果,
//                        .
//!(temp&(1<<16)) 逻辑非语句,先验证temp&(1<<16)先把1向左位移16位,
//           得到的就结果,在后temp按位与,得到的结果条件temp&(1<<16) 取反
 //          结果为0,取反为真;结果非0,取反为假

### 关于蓝桥杯竞赛中嵌入式ADC相关资料 #### 单次转换模式下的ADC操作 当涉及到单次转换模式时,该模式允许一次性的读取输入信号并将其转化为对应的数字量。一旦启动,它会在完成当前采样之后自动停止[^3]。 对于参与蓝桥杯的学生来说,在处理ADC数据的过程中加入均值滤波算法能够有效减少噪声干扰带来的误差。具体实现方式如下所示: ```c uint8_t ADC_collect_times = 10; // 定义ADC采集次数为10次 uint32_t Adc_num_all; // 存储多次采集后的总和 uint32_t Adc_Volt; // 计算得到的实际电压值 int i; void ADC_filter(void) { for (i = 0; i < ADC_collect_times - 1; i++) { Adc_num_all += get_adc(); HAL_Delay(10); // 可选延迟函数用于稳定测量环境 } Adc_num_all /= 10; // 对所有样本求平均值得到最终结果 /* 将获得的结果映射回实际物理意义 */ Adc_Volt = ((float)(Adc_num_all * 3.3)) / 4096; Adc_num_all = 0; // 清除旧的数据以便下次使用 } ``` 此段程序展示了如何通过循环调用`get_adc()`来获取多个连续时间点上的ADC数值,并计算这些数值的平均数作为输出。这有助于提高所测得电平的真实性和可靠性[^2]。 另外值得注意的是,为了确保系统的正常运行以及防止异常情况的发生,还可以利用STM32内部集成的功能——AWD模拟看门狗来进行监控。每当检测到超出预设范围内的变化时就会触发相应的中断服务例程(ISR),从而采取必要的措施保护电路安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值