glinfei 发表于 2021-1-8 16:22 这个最大最小油门就是最大最小行程吧?老板给的说明说不需要,只需要设置中间启动 |
|
首先是:计时时间太短,你的写法误差太大,应使用自动重装模式,中断中只有一句:time++;并将判断放到主程序,它到1000自然是一个周期嘛。如果能提高主频就更好了。 其次是:电调不是你这么用的啊,电调驱动电机转动需要两个步骤:1先给电调最大油门,你会听到“哔哔”;2“哔哔”后你再给电调最小油门,会听到”哔哔毕“,然后是一声较长的”毕“;3这时电调就准备好了,给一个1~2ms范围内的油门就可以转动了。你的程序都没干这些事,转不了啊。 |
|
很多小白不明白PWM怎么回事。只能说明你们看的教程没讲。我们人人学会单片机教程就讲过。其实很简单的。特分享CPU定时器模拟PWM输出给你们 #include "STC89.H" //头文件包含 #include <intrins.h> //头文件包含 typedef unsigned char u8; //重新定义数据类型名 typedef unsigned short u16; //重新定义数据类型名 typedef unsigned long u32; //重新定义数据类型名 sbit PWM_OUT=P2^1; u8 idata PWM_Write_Byte[3]=0; //****************************祁绪电子 2020年5月*** // 定时器0初始化 晶振11059200,12T,输出50Hz的PWM,占空比0~255 // 定时器初值为:256-(11059200÷12÷50Hz÷256) = 184 = 0xB8 void PWM_Init(void) { TMOD &= 0xF0; //配置定时器工作模式 TMOD |= 0x02; //配置定时器工作模式 8位自动重装模式 TL0 = 0xB8;; //定时器初值 TH0 = 0xB8; //定时器重装初值 TR0 = 1; //启动定时器0 ET0=1; //允许定时器0申请中断 EA=1; //中断总闸闭合 } //****************************祁绪电子 2020年5月*** //定时器0的CPU处理函数,位置任意写都行 void PWM_Display_timer0() interrupt 1 { static u8 pwm_t=0; //局部变量,不丢失数据 if(pwm_t<PWM_Write_Byte[0]) { PWM_OUT=1; } else PWM_OUT=0; pwm_t++; } //***************************祁绪电子 2020年5月*** // PWM 数模变换数据分配 void PWM_Allot() { static u8 kkk=0; static u8 count=0; count++; if(count>100) { count=0; kkk++; PWM_Write_Byte[0]=kkk; //kkk为占空比自动增加 PWM_Write_Byte[1]=10; PWM_Write_Byte[2]=10; } } void main() //主函数 { PWM_Init(); while(1) //主函数大循环 { PWM_Allot(); } } |