找回密码
 立即注册
查看: 83|回复: 3

ADC检测不正常

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:62
  • 最近打卡:2025-12-18 12:02:21
已绑定手机

28

主题

92

回帖

134

积分

注册会员

积分
134
发表于 2025-11-20 10:34:06 | 显示全部楼层 |阅读模式
  1. #include "STC8Hxxx.h"
  2. // 引脚定义
  3. sbit Pulse = P3^4;                          // PWM脉冲输出引脚
  4. // 宏定义
  5. #define MAIN_Fosc 35000000L                 // 主频35MHz
  6. // 声明
  7. // 数组
  8. // 函数
  9. void Timer2_Init(void);
  10. void ADC_INIT(void);
  11. u16 ADC_ReadChannel(u8 channel);
  12. // 变量
  13. u16 mv;
  14. bit ADC_mode = 0;                               // 0不使用ADC  1使用
  15. bit error = 0;                              // 0正常工作 1报警
  16. u16 timer_cnt = 0;
  17. // 函数模块
  18. // 初始化ADC模块(改为10位模式)
  19. void ADC_INIT(void)
  20. {
  21.     ADC_CONTR |= 0x80;   // 打开ADC电源
  22.     ADCCFG &= ~0x0f;     // 清除速度选择
  23.     ADCCFG |= 0x02;      // 设置采样速率
  24.     ADCTIM = 0x35;       // 设置采样保持时间
  25.     ADC_CONTR &= 0xDF;   // 清除完成标志
  26.     EADC = 0;            // 禁止ADC中断
  27.     ADCCFG &= ~0x20;     // 改为10位模式(清除第5位)
  28. }
  29. // 读取指定通道ADC值(10位)
  30. u16 ADC_ReadChannel(u8 channel)
  31. {
  32.     u16 result;
  33.     ADC_CONTR &= 0xF0;
  34.     ADC_CONTR |= (channel & 0x0F);
  35.     ADC_CONTR &= ~0x20;
  36.     ADC_CONTR |= 0x40;   // 启动ADC
  37.     while (!(ADC_CONTR & 0x20));  // 等待转换完成
  38.     ADC_CONTR &= ~0x20;           // 清除标志
  39.     result = ADC_RES;    // 高8位
  40.     result <<= 2;        // 左移2位
  41.     result |= (ADC_RESL >> 6);  // 取低2位放入结果
  42.     return result;       // 返回10位值(0~1023)
  43. }
  44. // 20毫秒@35.000MHz
  45. void Timer2_Init(void)               
  46. {
  47.         AUXR &= 0xFB;                        //定时器时钟12T模式
  48.         T2L = 0x23;                                //设置定时初始值
  49.         T2H = 0x1C;                                //设置定时初始值
  50.         AUXR |= 0x10;                        //定时器2开始计时
  51.         IE2 |= 0x04;                        //使能定时器2中断
  52. }
  53. // 返回值单位:mV(0~5000)
  54. u16 ADC_To_mV(u8 channel)
  55. {
  56.     u16 ad = ADC_ReadChannel(channel);
  57.     return (u32)ad * 5000 / 1023;    // 关键:用 32 位运算避免溢出和精度丢失
  58. }
  59. // 主函数
  60. void main(void)
  61. {
  62.     P3M0 = (P3M0 & ~0x20) | 0x10; P3M1 = (P3M1 & ~0x10) | 0x20;
  63.     P_SW2 |= 0x80;
  64.     EA = 1;
  65.         ADC_INIT();
  66.         Timer2_Init();
  67.     Pulse = 1;
  68.     while(1)
  69.     {
  70.         /*
  71.         // 30s后检测adc
  72.                 if(ADC_mode == 1)
  73.                 {
  74.             mv = ADC_To_mV(13);
  75.             if(mv < 160)
  76.             {
  77.                 error = 1;
  78.             }
  79.                 }
  80.                 // 停止所有工作 卡死在此处
  81.                 if(error == 1)
  82.                 {
  83.             Pulse = 0;
  84.                         while(1);
  85.                 }
  86.             */
  87.         mv = ADC_To_mV(13);
  88.         if(mv < 160)
  89.         {
  90.             Pulse = 0;
  91.         }
  92.         else
  93.         {
  94.             Pulse = 1;
  95.         }
  96.     }
  97. }
  98. void Timer2_Isr(void) interrupt 12
  99. {
  100.         timer_cnt++;
  101.     if(timer_cnt >= 250)  // 20ms × 1500 = 30s
  102.     {
  103.         ADC_mode = 1;
  104.     }
  105. }
复制代码
现在用的AI8H1K08
问题是 现在Pulse 的引脚状态没有跟随 ADC值的变化而变化

AD值大了也不灭 小了也不灭

但是这个初始化函数改成12位用在STC8H1K08T的上面的时候又是很好用的
从参考电压也接上了 也确认了传入的值是我对应需要的ADC通道的引脚
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:621
  • 最近打卡:2025-12-18 10:55:24
已绑定手机

44

主题

2576

回帖

2703

积分

荣誉版主

积分
2703
发表于 2025-11-20 10:56:35 | 显示全部楼层
建议先调个串口出来,用串口发送ADC的值 用串口控制PWM,调试都没问题了再联调,
也可以用单片机的debug功能,断点调试运行情况
睁开眼睛做场梦~~~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21316
发表于 2025-11-20 13:08:07 | 显示全部楼层
用最新 ISP软件中的 AiCube 来自动生成 ADC / 串行口 程序
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:62
  • 最近打卡:2025-12-18 12:02:21
已绑定手机

28

主题

92

回帖

134

积分

注册会员

积分
134
发表于 2025-11-20 15:04:40 | 显示全部楼层
神*** 发表于 2025-11-20 13:08
用最新 ISP软件中的 AiCube 来自动生成 ADC / 串行口 程序

我试一下
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-18 18:59 , Processed in 0.101990 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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