dd418890434 发表于 2024-12-18 01:09:02

关于32G双通道采集电压比较中断怎么修改,完全没头绪

<pre><code>#include &lt;STC32G.H&gt;
#include &lt;intrins.h&gt;
sbit LED1 = P2^2;
sbit LED2 = P2^1;

// 延时函数10ms
void delay(void) {
    unsigned char i, j;
    i = 108;
    j = 145;
    do {
      while (--j);
    } while (--i);
}
// 初始化ADC
void InitADC(void) {

    // 使用P1.1,P1.4作为ADC输入:
P1M1 |= 0x10;// 设置P1.4为ADC功能
P1M0 &amp;= ~0x10; // 清除P1.4的位,设置为ADC功能
P1M1 |= 0x02;// 设置P1.1为ADC口
P1M0 &amp;= ~0x02; // 清除P1.1的位,设置为ADC功能
                        //ADC配置
        ADCM = 0x03;// 选择通道0和通道1
        ADCTIM = 0x3f; //设置 ADC 内部时序
        ADCCFG = 0x0f; //设置 ADC 时钟为系统时钟/2/16/16
        ADC_POWER =1; //使能 ADC 模块
        EADC = 1; //使能 ADC 中断
        EA = 1;
        ADC_START = 1; //启动 AD 转换
}

// ADC中断服务程序
void ADC_Isr() interrupt 5{
                                if (ADC_FLAG) {
      ADC_FLAG = 0;// 清中断标志
                                unsigned int adc_result0 =(ADC_RES &lt;&lt; 8) | ADC_RESL;;                  
         if (adc_result0 &gt; (4096 * 2.5 / 5)) // 计算电压大于2V   
                                        {
            LED1 = 0; // 电压大于2V时熄灭LED1
      }
                               
                               unsigned int adc_result1 =(ADC_RES &lt;&lt; 8) | ADC_RESL;;
                               if (adc_result1 &gt; (4096 * 2.5 / 5))// 计算计算电压大于2.5V   
                                       {                        
            LED2 = 0; // 电压大于2V时熄灭LED1
      }
    }
void main() {
LED1 =1;
LED2 =1;
P2M0 |= 0x06;
P2M1 &amp;= ~0x06;
InitADC();// 初始化AD

    // 主循环
    while (1) {
   
    }
}

</code></pre>
<p>要实现32G双通道采集电压然后比较结果中断。互不干涉</p>

社区闲人 发表于 2024-12-18 09:02:42

在主循环中切换ADC输入通道。

社区闲人 发表于 2024-12-18 09:04:52

或者在定时中断中切换ADC输入通道。

梁工 发表于 2024-12-18 10:19:59

多少个通道都会是独立、互不干扰的。
使用定时器或PWMA触发ADC最开始的通道,在ADC中断里读取ADC值并判断,再触发下一个通道,知道最后一个通道读取处理好,然后将通道切换至最开始的通道,等待下一次触发。

dd418890434 发表于 2024-12-18 20:37:17

梁工 发表于 2024-12-18 10:19
多少个通道都会是独立、互不干扰的。
使用定时器或PWMA触发ADC最开始的通道,在ADC中断里读取ADC值并判断, ...

也就是要轮流触发呗,不能同时一起。好的感谢

dd418890434 发表于 2024-12-18 20:38:01

社区闲人 发表于 2024-12-18 09:04
或者在定时中断中切换ADC输入通道。

好的

dd418890434 发表于 2024-12-23 20:21:04

梁工 发表于 2024-12-18 10:19
多少个通道都会是独立、互不干扰的。
使用定时器或PWMA触发ADC最开始的通道,在ADC中断里读取ADC值并判断, ...

修改了你的一=一个代码不知道对不对,实验LED亮灭正常
#include        "STC32G.h"
#include        "uartl.h"

//本地变量声明       
sbit LED1   = P2^2;
sbit LED2   = P2^1;
//本地函数声明       
void        ADC_config(void);
u16                Get_ADC12bitResult(u8 channel);
void        ADC_convert(u8 chn);        //chn=对应通道P1.1 P1.4

// 描述: 延时函数。
void delay(unsigned int ms)
        {
    unsigned int i, j;
    for (i = ms; i > 0; i--) {
      for (j = 114; j > 0; j--);
}
}
//主函数
void main(void)
{

P2M0 |= 0x06; P2M1 &= ~0x06;

        WTST= 0;
        CKCON = 0;
        EAXFR = 1;        //允许访问扩展寄存器
       
        LED1 = 1;
        LED2 = 1;
        ADC_config();
        UART1_config();
        EA = 1;
        delay(10);
       
        while (1)
        {       
                        ADC_convert(1);                       
                        ADC_convert(4);
               
                        }
}
// 描述: ADC配置函数.
#define ADC_POWER        (1<<7)        //打开ADC电源
#define ADC_START        (1<<6)        // 自动清0
#define ADC_FLAG        (1<<5)        //软件清0
#define ADC_EPWMT        (0<<4)        //允许PWM触发ADC
#define        RES_FMT                (1<<5)        //ADC结果格式 0: 左对齐,
#define        ADC_SPEED        1                                //ADC时钟
#define CSSETUP                (1<<7)        //ADC通道选择时间   
#define CSHOLD                (1<<5)        // ADC通道选择保持时间
#define SMPDUTY                30                        // ADC模拟信号采样时间
                                               
void        ADC_config(void)
{
        EAXFR = 1;        //SFR enable, 允许访问扩展寄存器
        P1M0 &= ~0x12; P1M1 |= 0x12;         //设置要做ADC的IO做高阻输入
        ADC_CONTR = 0x80 + 0;        //ADC on + channel
        ADCCFG = RES_FMT + ADC_SPEED;
        ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
}

// 描述: 查询法读一次ADC结果.
u16        Get_ADC12bitResult(u8 channel)
{
        u16        adc;
        adc = 0;
        ADC_RES = 0;
        ADC_RESL = 0;
        ADC_CONTR = 0x80 | ADC_START | channel;
        delay(2);                        //
        while((ADC_CONTR & ADC_FLAG) == 0)        ;        //等待ADC结束
        adc = ((u16)ADC_RES * 256 + (u16)ADC_RESL);
        ADC_CONTR &= ~ADC_FLAG;
        return adc;
}

#define                SUM_LENGTH        16        //平均值采样次数 最大值16
//查询方式做一次ADC, chn为通道号,
void        ADC_convert(u8 chn){
    u16 j;
    u8 k;
   
                        // 验证通道号
    if (chn != 1 && chn != 4) {
      // 如果通道号不是1或4,则不执行任何操作或返回错误
      return;
                }

        Get_ADC12bitResult(chn);               
        for(k=0, j=0; k<SUM_LENGTH; k++)        j += Get_ADC12bitResult(chn);       
        j = j / SUM_LENGTH;               
               
                       
        Uart1_TxByte('A');
        Uart1_TxByte('D');
        Uart1_TxByte('C');
        Uart1_TxByte((u8)(chn/10+'0'));
        Uart1_TxByte((u8)(chn%10+'0'));
        Uart1_TxByte('=');                               
        Uart1_TxByte((u8)(j/1000 + '0'));
        Uart1_TxByte((u8)(j%1000/100 + '0'));
        Uart1_TxByte((u8)(j%100/10 + '0'));
        Uart1_TxByte((u8)(j%10 + '0'));
        Uart1_TxByte(' ');
        Uart1_TxByte(' ');
        delay(2000);
        Uart1_TxByte(0x0d);
        Uart1_TxByte(0x0a);
               

      if (j>2000 && chn == 1) //j=4096乘以所需电压2V除以5V
                                                {
            LED1 = 0; // 熄灭LED1
                                                }
                                if (j >2000 && chn == 4)//j=4096乘以所需电压2V除以5V
                                                {
            LED2 = 0; // 熄灭LED2
                                                }
                                        }
页: [1]
查看完整版本: 关于32G双通道采集电压比较中断怎么修改,完全没头绪