旅途1 发表于 2021-5-12 16:59 你在做PWM调节吗? 1 确定键全局变量换成普通数字是否会恢复正常 2 中断是否会嵌套 例如TIM1中断里面触发TIM2中断 3 你的全局变量是否在主函数频繁出现 例如if(First > 0){delay_ms(10);这里是中断{First = 0;}First = First - 100;} |
不合理,进debug看汇编代码大概查一下。 |
黄youhui 发表于 2021-5-12 10:11 uint curvalue; uint error; uint enlarge; uint FRE=0; uint First=500; uint setvalue=20; //数据类型 uint为"unsigned int" void time1() { TMOD |=0X01; TH0=(65536-2000)/256; TL0=(65536-2000)%256; EA=1; ET0=1; TR0=1; } void TIM2Inital() { T2MOD=0; TH2=(65536-(First+FRE))/256; //设置定时初值 TL2=(65536-(First+FRE))%256; //设置定时初值 RCAP2H = (65536-(First+FRE))/256; //设置定时重载值 RCAP2L = (65536-(First+FRE))%256; //设置定时重载值 EA=1; //打开总中断 ET2=1; //打开定时器中断 TR2=1; //打开定时器开关 } void timer1(void)interrupt 1 { TH0=(65536-2000)/256; TL0=(65536-2000)%256; RCAP2H = (65536-(First+FRE))/256; //设置定时重载值 RCAP2L = (65536-(First+FRE))%256; //设置定时重载值 } void TM2(void) interrupt 5 using 1 { TF2=0; //自动清零 if(curvalue<=20) { error=setvalue-curvalue; //偏差,靠近设定值时递减 enlarge=50*error; //放大 FRE=1000-enlarge; //靠近设定值时FRE递增,脉冲频率变大,速度变慢 DIR=1; if(error<3) { ET2=0; } } else { DIR=0; error=curvalue-setvalue; //同上 enlarge=5*error; FRE=1000-enlarge; } shudu2=~shudu2; } |
黄youhui 发表于 2021-5-12 10:11 谢谢您的回答 这个 我试了下 定时器0 写(65536-1000)/256和直接写“256”这样都是两个机器周期 TM2定时器直接写“256”这样的也是两个机器周期 而(65536-(First+FRE))/256这样写就600多个机器周期 ![]() 下面附上部分程序 |
旅途1 发表于 2021-5-12 10:00 这样试试看,你初始化时不要计算(65536-1000)/256这些,你就直接TH0 = 252;TH1 = 24;.可能是你的单片机不具备多位数的算法(浮点算法) |
黄youhui 发表于 2021-5-12 08:24 不是 就这一个 所以很纳闷 |
名字不是重点 发表于 2021-5-11 23:21 用keil5仿真 可以看汇编语言吗 |
TTQ001 发表于 2021-5-12 07:45 是每个指令都600机器周期吗?如果是的话就是单片机问题。 |
600个机器指令周期似乎是不可能的。 |
写的timer1实际上是定时器0。。。。一个加法减法除法应该用不了那么多,仔细检查一下 |
这个要看C代码展开后的汇编代码是什么。。 一行C可能会编译成N条汇编指令。。 |
确认First和FRE是否为浮点数据类型 |
花心的刘备 发表于 2021-5-11 21:33 不是 为unsigned int类型 |
npn 发表于 2021-5-11 17:55 不是 无符号整数型 |
First和fre是什么类型的?是不是float类型的? |
请确认First和FRE是否为浮点数据类型。 |