完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include "stc12c5a60s2.h" #include #include #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long float Volt; uint num; ***it RPWM=P3^0; ***it LPWM=P3^1; ***it shineng=P3^2; bit bzw1 = 0; bit bzw2 = 0; bit bzw3 = 0; bit bzw4 = 0; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void AD_init() { P1M0=0x01; P1M1=0x01; //P1ASF=0x01; ADC_RES=0; ADC_RESL=0; ADC_CONTR=0xe0; delay(20); } uint Get_AD(uchar channel) { ADC_CONTR=0x88|channel; // 开启AD转换 1110 1000 _nop_(); _nop_(); _nop_(); _nop_(); while(!(ADC_CONTR&0x10)); ADC_CONTR&=0xe7; //关闭AD转换 return(ADC_RES*4+ADC_RESL); } float AD_work(uchar channel) { float AD_val; AD_val=Get_AD(channel); AD_val=(AD_val*5.0)/1024; return(AD_val); } void PWM1() { shineng=1; LPWM=0; RPWM=1; delay(10); RPWM=0; delay(5); } void PWM2() { shineng=1; RPWM=0; LPWM=1; delay(10); LPWM=0; delay(5); } void main() { AD_init(); TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; while(1) { if(bzw1==1) { PWM1(); } if(bzw3==1) { Volt= AD_work(0)*100; if(Volt>3) { shineng=0; } } if(bzw2==1) { PWM2(); } if(bzw4==1) { Volt= AD_work(0)*100; if(Volt>3) { shineng=0; } } } } void T0_time() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; num++; if(num == 1) { bzw1 = 1; } else if(num == 4) { bzw3 = 1; } else if(num == 41) { bzw1 = 0; bzw3 = 0; } else if(num == 101) { bzw2 = 1; } else if(num == 104) { bzw4 = 1; } else if(num == 141) { bzw2 = 0; bzw4 = 0; } else if(num == 200) { num = 0; } } 这是本人写的程序,用的是12系列的单片机。驱动电机驱动模块,现在用单片机内部的AD模块对电机驱动芯片的电流信号调理端进行检测。内部的AD模块已经通过测试可以在1602显示。但是在主程序中使用AD模块检测电压,发现检测不了。定时器程序中我用了4个标志位,不知道是不是标志位的问题,现在AD模块不能工作。麻烦大神帮我看一下,哪里有问题。急急急!谢谢啦!
|
|
相关推荐
13个回答
|
|
//P1ASF=0x01;,这个为什么被屏蔽了
|
|
|
|
|
|
|
|
先把单片机的手册看看
|
|
|
|
|
|
|
|
试了 ,还是不行! 请问是AD中断的问题吗? |
|
|
|
|
|
|
|
注意看手册,P1ASF和端口设置是不一样的,你现在是把端口的ADC功能关闭了,又怎么能实现AD呢
|
|
|
|
我重新弄过之后还是不行,请问还可能是什么原因呢? |
|
|
|
你最好能在1602上看看AD转换的值是多少,定时器设的几个标志应该没问题,只是问题在于到达这些标志的时间是多少,测试时等待的时间是否足够。
在标志成立时,仍需要Volt>3成立,测试时这个条件是否能达到。 最好能增加显示功能,这样可以多看到一些状态,也好判断问题原因 |
|
|
|
各标志清零的地方不对,
if(bzw1==1) { PWM1(); } if(bzw3==1) { Volt= AD_work(0)*100; if(Volt>3) { shineng=0; } } 这里,即使bzw3==1,执行了ad部分,也就算ad部分执行正确,但是,bzw1没清零,当while从头循环时,还会执行 if(bzw1==1) { PWM1(); } 部分的,各标志应该在有效并执行了相应操作后,就直接清零 |
|
|
|
|
|
|
|
我需要在bzw3==1时 继续执行AD程序 当AD采集到的数据大于设定数据时 电机此时停止。因为电机启动的瞬间电压较高,所以电机启动后100ms才采集电压。 |
|
|
|
谢谢啊! 不过我试了一下 还是不行。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
460 浏览 0 评论
【敏矽微ME32G070开发板免费体验】+ADC测试与LED点亮
418 浏览 0 评论
飞凌嵌入式-ELFBOARD ELF 2的硬件知识分享--核心板
352 浏览 0 评论
【敏矽微ME32G070开发板免费体验】\\+Lora通信终端产品开发项目
514 浏览 0 评论
1576 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11969 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 10:12 , Processed in 0.768467 second(s), Total 101, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号