关于32G双通道采集电压比较中断怎么修改,完全没头绪
<pre><code>#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) {
}
}
</code></pre>
<p>要实现32G双通道采集电压然后比较结果中断。互不干涉</p>
在主循环中切换ADC输入通道。 或者在定时中断中切换ADC输入通道。 多少个通道都会是独立、互不干扰的。
使用定时器或PWMA触发ADC最开始的通道,在ADC中断里读取ADC值并判断,再触发下一个通道,知道最后一个通道读取处理好,然后将通道切换至最开始的通道,等待下一次触发。 梁工 发表于 2024-12-18 10:19
多少个通道都会是独立、互不干扰的。
使用定时器或PWMA触发ADC最开始的通道,在ADC中断里读取ADC值并判断, ...
也就是要轮流触发呗,不能同时一起。好的感谢 社区闲人 发表于 2024-12-18 09:04
或者在定时中断中切换ADC输入通道。
好的 梁工 发表于 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]