找回密码
 立即注册
查看: 291|回复: 6

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-06 01:44:39
已绑定手机

3

主题

9

回帖

63

积分

注册会员

积分
63
发表于 2024-12-18 01:09:02 | 显示全部楼层 |阅读模式
#include <STC32G.H>
#include <intrins.h>
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 &= ~0x10; // 清除P1.4的位,设置为ADC功能
P1M1 |= 0x02;  // 设置P1.1为ADC口  
P1M0 &= ~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 << 8) | ADC_RESL;;		  
         if (adc_result0 > (4096 * 2.5 / 5)) // 计算电压大于2V   
					{  
            LED1 = 0; // 电压大于2V时熄灭LED1
        }
				 
				 unsigned int adc_result1 =  (ADC_RES << 8) | ADC_RESL;; 
				 if (adc_result1 > (4096 * 2.5 / 5))  // 计算计算电压大于2.5V   
					 { 			 
            LED2 = 0; // 电压大于2V时熄灭LED1
        }
    }
void main() {
LED1 =1;
LED2 =1;
P2M0 |= 0x06; 
P2M1 &= ~0x06; 
InitADC();  // 初始化AD

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

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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:524
  • 最近打卡:2025-05-12 05:13:57

24

主题

520

回帖

1040

积分

荣誉版主

积分
1040
发表于 2024-12-18 09:02:42 | 显示全部楼层
在主循环中切换ADC输入通道。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:524
  • 最近打卡:2025-05-12 05:13:57

24

主题

520

回帖

1040

积分

荣誉版主

积分
1040
发表于 2024-12-18 09:04:52 | 显示全部楼层
或者在定时中断中切换ADC输入通道。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-05-12 09:50:54

73

主题

5922

回帖

1万

积分

超级版主

积分
12207
发表于 2024-12-18 10:19:59 | 显示全部楼层
多少个通道都会是独立、互不干扰的。
使用定时器或PWMA触发ADC最开始的通道,在ADC中断里读取ADC值并判断,再触发下一个通道,知道最后一个通道读取处理好,然后将通道切换至最开始的通道,等待下一次触发。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-06 01:44:39
已绑定手机

3

主题

9

回帖

63

积分

注册会员

积分
63
发表于 2024-12-18 20:37:17 | 显示全部楼层
梁*** 发表于 2024-12-18 10:19
多少个通道都会是独立、互不干扰的。
使用定时器或PWMA触发ADC最开始的通道,在ADC中断里读取ADC值并判断, ...

也就是要轮流触发呗,不能同时一起。好的感谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-06 01:44:39
已绑定手机

3

主题

9

回帖

63

积分

注册会员

积分
63
发表于 2024-12-18 20:38:01 | 显示全部楼层
社区*** 发表于 2024-12-18 09:04
或者在定时中断中切换ADC输入通道。

好的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-06 01:44:39
已绑定手机

3

主题

9

回帖

63

积分

注册会员

积分
63
发表于 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
                                                }
                                        }
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-12 23:04 , Processed in 0.114226 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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