stc15w408astc15w204s串口程序号工作模式2,SMOD无法清零,即SMOD=0;

这里暂且不说其他工作方式,以后有时间补上。仅总结下STC15串口工作方式1的一些注意点。
setp1 波特率发生器:
  T2定时器(默认)、T1定时器: 设置位:S1ST2(AUXR.0),1--T2,0--T1,此位复位值为1。
    12T模式(默认):通过T2x12(AUXR.2),T1x12(AUXR.6)位确定,0--12T模式,1--1T模式;这两位复位值位0。
            (这里可能有点模糊, 解释一下:所谓1T模式就是T1X12位置1,相当于T1速度提高12倍,原来计数加1需要12T,现在只需要1T)
    16位自动重装(默认):即T1定时器工作方式0,STC15这里是自动重装的。T2的不用设置TCON,固定为16位自动重装。
      8位自动重装(可选):如果用8位重装,只能通过S1ST2位选择T1定时器。然后把T1定时器设置为工作方式2。为了与传统8051程序兼容
setp2 设置波特率:
  这一步用T2定时器来说明,T1定时器的设置方法与其完全相同。
  情况1:16位重装模式下
    波特率 = T2溢出率 / 4
      其中,T2溢出率 = 1 / 溢出周期 = 1 / ( 时钟周期 * 计数次数 ) = Fosc / 计数次数 ;
    则
      计数次数 = Fosc / 波特率 / 4
      [T2H,T2L] = ( 65536 - 计数次数 ) = 65536 - Fosc / 波特率 / 4
    (Fosc是晶振频率,如果T2定时器工作在12T模式下Fosc需除以12)
  注意:STC15的16位重装计数波特率和SMOD无关,与传统51不同 ,如果用T1的8位重装计数的话与传统51计算方法是一样的。
  情况2 :8位自动重装计数
    与传统的相同: 波特率 = ( 2^smod / 32 ) * Fosc / ( 256 - TH1 )
setp3 设置串口模式启动串口
  串口模式工作方式1 设置SCON为0x40
  开启定时器2:T2R(AUXR.4)置1
  关闭定时器2中断允许:ET2(IE2.2)置0
  定时器1的不多讲了
示例:串口1,晶振为FOSC,波特率为BAUD,定时器用定时器1
AUXR |= 0x40;AUXR &= ~0x01;TMOD &= ~0xF0;
SCON = 0x40; TL1 = (65536 - (FOSC/4/BAUD)); TH1 = (65536 - (FOSC/4/BAUD))&&8; TR1 = 1; ET1 = 0; ES = 1; REN=1;
阅读(...) 评论()51单片机STC15W408AS驱动无感无刷电机BLDC
作者:瑞生
阅读:17,437次
瑞生网版权所有
看到很多人在用C8051做无感无刷电机的驱动,今天瑞生给大家来个国产51单片机STC15W408AS驱动无刷电机的驱动资料吧!
1.硬件设计
主控单片机使用STC15W408AS,单片机自带硬件PWM模块、ADC模块和比较器模块,所以非常适合做无刷电机的驱动,主频35M,无需外部晶振和复位电路,接好VCC和GND就可以工作。半桥电路使用PMOS+NMOS的组合,PMOS为IRF9540,NMOS为IRF540.驱动芯片用TC4427A。
先在洞洞板上做实验吧。原理图如下所示,懒得用软件画了,还是手画来得快些。下面的图中,只画出了A相的桥,B相和C相的桥与A相一样。
依照原理图,焊接好的板子如下图所示:
2.软件设计
2.1PWM模块
PWM模块用来产生可调占空比,目的是为了给电机施加一定的电压,占空比越大,施加的电压越大,电机转的越快。反之,占空比越小,电机转的越慢。
void PWM_Init(void)
CMOD=0X0C; //选择系统时钟/6为时钟源,即频率=35M/6/256=22.8K
CL=0; // PCA计数器清零
PCA_PWM0 = 0X00;
CCAP0H=0; // 初始化占空比为0% H的值装载到L中
CCAPM0=0x42; // 设置为PWM模式
PCA_PWM1 = 0X00;
CCAP1H=0; // 初始化占空比为0%
CCAPM1=0x42; // 设置为PWM模式
PCA_PWM2 = 0X00;
CCAP2H=0; // 初始化占空比为0%
CCAPM2=0x42; // 设置为PWM模式
2.2ADC模块和比较器模块
比较器用来做反电动势的过零检测,选择P5.4引脚为比较器的负输入端,选择ADC通道为比较器的正输入端。
void CMP_Init(void) // 比较器初始化函数
CMPCR1=0X8C; // 打开比较器,把P5.4引脚设置为负输入端,ADC通道为正输入端
CMPCR2=50;// 延时消抖时间设置
void ADC_Init(void) // ADC模块初始化
P1ASF = 0X38; //开通P1.3 P1.4 P1.5端口的模拟输入端
2.3六步时序换相
BLDC的六步时序为AB AC BC BA CA CB,下面程序中,分别用0~5表示每一步。
void StepXL(void) // 换相序列函数
switch(Step)
case 0: // AB
CCAP0H=PWM_VCCAP1H=0;CCAP2H=0; // 打开A相的高端
PWM0_L=0;PWM2_L=0;PWM1_L=1; // 打开B相的低端
ADC_CONTR = 0XED; // 选择P1.5作为ADC输入 即c相电压
CMPCR1=0x9c; // 使能下降沿中断
case 1: // AC
CCAP0H=PWM_VCCAP1H=0;CCAP2H=0; // 打开A相的高端
PWM0_L=0;PWM1_L=0;PWM2_L=1; // 打开C相的低端
ADC_CONTR = 0XEC; // 选择P1.4作为ADC输入 即B相电压
CMPCR1=0 // 使能上升沿中断
case 2: // BC
CCAP0H=0;CCAP2H=0;CCAP1H=PWM_V // 打开B相的高端
PWM0_L=0;PWM1_L=0;PWM2_L=1; // 打开C相的低端
ADC_CONTR = 0XEB; // 选择P1.3作为ADC输入 即a相电压
CMPCR1=0x9c;// 使能下降沿中断
case 3: // BA
CCAP0H=0;CCAP2H=0;CCAP1H=PWM_V // 打开B相的高端
PWM1_L=0;PWM2_L=0;PWM0_L=1; // 打开A相的低端
ADC_CONTR = 0XED; // 选择P1.5作为ADC输入 即c相电压
CMPCR1=0 // 使能上升沿中断
case 4: // CA
CCAP0H=0;CCAP1H=0;CCAP2H=PWM_V // 打开C相的高端
PWM1_L=0;PWM2_L=0;PWM0_L=1; // 打开A相的低端
ADC_CONTR = 0XEC; // 选择P1.4作为ADC输入 即B相电压
CMPCR1=0x9c; // 使能下降沿中断
case 5: // CB
CCAP0H=0;CCAP1H=0;CCAP2H=PWM_V// 打开C相的高端
PWM0_L=0;PWM2_L=0;PWM1_L=1; // 打开B相的低端
ADC_CONTR = 0XEB; // 选择P1.3作为ADC输入 即a相电压
CMPCR1=0 // 使能上升沿中断
2.4电机启动函数
char QiDong(void)
unsigned int timer = 300,i;
DISABLE_CMP_INT;
PWM_Value = 26; // 占空比=26/256=10%
delay_ms(100);
for(i=0;i& i++)
delay_us(100); //
timer-= timer/15+1;
if(timer & 25) return(1);
if(Step&5)Step++;
else Step=0;
2.5闭环控制
电机启动以后,需要闭环控制电机的通电时序和速度。这个在比较器的中断函数里面实现。
void CMP_INT(void) interrupt 21 // 比较器中断函数
CMPCR1 &=~0X40; // 需软件清除中断标志位
if(Step&5)Step++;
else Step=0;
ADC转换结束后,必须软件清除转换标志,再重新开启ADC转换
void ADC_ISR() interrupt 5
ADC_CONTR&=0xEF; // 清ADC转换标志
ADC_CONTR|=0X08; // 启动ADC转换
2.6通信控制接口
用电脑上的串口调试助手给单片机串口发送“启动”“加速”“减速”“停止”命令。这个功能放到主函数while循环中。
串口初始化函数:
void serial_open(void)
SCON = 0X50;//工作在串口模式
AUXR |= 0X04;//
TL2 = 0X71;// 9600 @35MHz
AUXR|=0X10;
void main(void)
uchar rec=0; // 定义串口接收数据变量
PWM_Init(); // 初始化PWM
ADC_Init(); // 初始化ADC
CMP_Init(); // 初始化比较器
serial_open(); // 打开串口
if(RI) // 如果串口收到数据
rec=SBUF; // 把收到的数据给了rec
RI=0; // 串口接收标志清0
if(rec==0x22)// 加速命令
if(PWM_Value&250)
PWM_Value++; // 增加占空比
else if(rec==0x33)// 减速命令
if(PWM_Value&10)
PWM_Value--; // 减小占空比
else if(rec==0x11) // 启动命令
QiDong(); // 启动
ENABLE_CMP_INT; // 允许比较器中断
EA=1; // 打开全局中断
else if(rec==0x44) // 停止命令
CCAP0H=0;CCAP1H=0;CCAP2H=0;
// 占空比都置0
EA=0; // 关闭全局中断
DISABLE_CMP_INT; // 关闭比较器中断
上面的软件和硬件,只是实现了简单的控制转动。缺点:1.没有任何的保护程序,比如电流检测、堵转保护等。我在做实验的过程中,烧了2个PMOS、1个NMOS、3个TC4427A.2.比较器过0直接换相,有些提前。电机转动噪音比较大。期待日后改进吧!
源程序工程文件,点击下载:
现在已经做好电路板了,请看:
推荐:我的微信公众号(扫一扫关注)21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
STC15W408AS按键INT0启动后立即停止?
&&未结帖(15)
主题帖子积分
资深技术员, 积分 305, 距离下一级还需 195 积分
资深技术员, 积分 305, 距离下一级还需 195 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 305, 距离下一级还需 195 积分
资深技术员, 积分 305, 距离下一级还需 195 积分
简单看了一下,楼主没指定IT0,默认为0是上升下降沿都产生中断,滴滴两声很正常
主题帖子积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
coody 发表于
STC的PCA也是16位可翻转IO的。
8位是PWM。
这是STC15W的PCA高速输出模式说明,上面说CCAPnL的值决定了PCA模块的输出频率,并且实际测试也是如此。不知道怎样才能使用16位的高速输出,这样就不用换芯片了。STC12系列的可以16位高速输出,搞笑的是STC15W的说明书中PCA的例子“11.8用CCP/PCA软硬件结合实现9-16位PWM输出的程序”中注释在STC12系列上测试通过,而其他例子都没有这个注释。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
STC的出来说一下15W的PCA到底能不能用16位的高速输出
主题帖子积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:0.10
主题帖子积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
STC的官网就有用PCA做9~16位PWM的程序,就是16位高速输出的啊
主题帖子积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
初级工程师, 积分 2277, 距离下一级还需 723 积分
他那个PCA做9~16位PWM的程序例子我在STC12C2052上试可以,可在STC15W404AS上试怎么也不行,并且那个程序特意注明在STC12系列上测试通过,而其他的程序则没这个注明,看手册上也确实没有16位高速输出,只有8位的脉冲输出
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
本帖最后由 stcmcunt011 于
09:41 编辑
STC15W的说明书中PCA的例子“11.8用CCP/PCA软硬件结合实现9-16位PWM输出的程序”中注释在STC12系列上测试通过,而其他例子都没有这个注释。并且那个程序特意注明在STC12系列上测试通过
我在说明书里没看到这句嘛,有截图吗?这个手册8月6日更新过的,程序有改动。
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
15W408AS神奇?
偶尔有发现奇怪动作:电路中用单片机控制两个继电器,程序中规定是轮流动作。这个程序在STC5608上运行的很正常。
到15W408AS上,居然变成里两个同时一起动作了。
原来设置是P1=0xff,然后,按需要打开,就设jr=0,一个继电器就动作,另外一个js不会动。
琢磨半天,把jr=0(打开一个继电器)语句旁,再加个js=1;才能达到继电器一个动,一个静止不动。
什么原因,实在搞不懂!
主题帖子积分
资深技术员, 积分 305, 距离下一级还需 195 积分
资深技术员, 积分 305, 距离下一级还需 195 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 305, 距离下一级还需 195 积分
资深技术员, 积分 305, 距离下一级还需 195 积分
如何RH 发表于
<font color="#W408AS神奇?
偶尔有发现奇怪动作:电路中用单片机控制两个继电器,程序中规定是轮流动作。这个程序在STC ...
这应该是程序问题,我用sop16封装的408as做的控制板控制六个继电器还有级联的,从没出过乱序的问题。
主题帖子积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:0.10
主题帖子积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
资深工程师, 积分 11506, 距离下一级还需 8494 积分
看了前面的描述,基本是程序问题。51的IO都是可以位访问的。
主题帖子积分
资深技术员, 积分 330, 距离下一级还需 170 积分
资深技术员, 积分 330, 距离下一级还需 170 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
资深技术员, 积分 330, 距离下一级还需 170 积分
资深技术员, 积分 330, 距离下一级还需 170 积分
这15w404As系列的外部中断,某些上升沿和下降沿均可以产生。所以最好在程序中按照你的要求进行设置,不要使用默认值。不然你按下和弹起,都会产生中断。注意看手册里面的描述。我现在在用15w404as。
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
请推荐业务员编号
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
从执行动作上看,确实是按下、抬起出现两次动作。程序里如何确立只能有一次动作,还望举例
主题帖子积分
资深技术员, 积分 327, 距离下一级还需 173 积分
资深技术员, 积分 327, 距离下一级还需 173 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 327, 距离下一级还需 173 积分
资深技术员, 积分 327, 距离下一级还需 173 积分
路过学习!!!!
主题帖子积分
资深技术员, 积分 327, 距离下一级还需 173 积分
资深技术员, 积分 327, 距离下一级还需 173 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 327, 距离下一级还需 173 积分
资深技术员, 积分 327, 距离下一级还需 173 积分
不错!顶一下!!!
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
你好,源程序是否能一看
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
中级技术员, 积分 117, 距离下一级还需 183 积分
中级技术员, 积分 117, 距离下一级还需 183 积分
/*------------------------主函数----------------------*/
&&int main ()
& &&&P1&&= 0& && && && && && &
& &&&ledr=0;
& &&&EX0 = 0;& && && && &
//& &&&IE0 = 0;
& &&&nume=0;
& &&&while(1)
& && && & _nop_();
& && && &if(DA==0)
& & & & & & & && &&&{
& && && && && & _nop_();& && && &
& && && && && & _nop_();& && && &_nop_();
& && && && && & delay(10);& && && && &&&
& && && && && & }
& && && & }
& && && &//------------------------------------
& && && && && &delay10ms(60);
& && && && && &_nop_();
& && && && && &_nop_();
& && && && && &while (DA == 0);
& & & & & & & && && && && &{
& && && && && &&&didi_f1();& && &
& && && && && & _nop_();
& && && && && & _nop_();
&&TMOD = 0x01;
&&EA&&= 1;& && && && &&&
&&ET0 = 1;& && && && &&&
&&TR0 = 1;& && && && &&&
&&EX0 = 0;& && && && &&&
&&IE0 = 0;& && && && &&&
&&PX0 = 1;& && && && &&&
&&PT0 = 0;& && && && &
/**********************************************************/
& && && &&&_nop_();_nop_();
& && && &&&_nop_();_nop_();
& && && &&&xhd();& && && && && && &&&/*调用工作函数*/
& && && && &&&}
& & & && && && &}
& & & && & }& &
/*-----------------------------工作函数----------------------------------*/
& &xhd()& && && && && && && && && && && &&&
& && && & EA=1;& &&&
//**************************************************************************
以上,就是上电按键启动的一段程序,按键后会自动进行一个开、一个关,两个动作,
另外一方面,也说明STC15W的速度比12C系列快好多
技术奇才奖章
人才类勋章
时间类勋章
晶莹之水滴
发帖类勋章
精英会员奖章
等级类勋章
奔腾之江水
发帖类勋章
技术领袖奖章
人才类勋章
时间类勋章
技术新星奖章
人才类勋章
时间类勋章
时间类勋章
涓涓之细流
发帖类勋章查看: 2885|回复: 7
哪里有STC15W408AS.H 头文件下载?
没有找到,哪位高人有呢
打开STC-ISP 右上角有个头文件找到你要的型号复制,粘贴在H文件里就OK了
回帖助人的奖励!
STC官网有下的,另外,打开STC-ISP下载器最新版本的(也是去STC官网下),在右边往后翻找到头文件,里面有各种型号的,复制下来保存一下就可以了。
我这里有的。也可以去CSDN上下载
去单片机官网看看
官网例程,15系列的,里面那个stc15xxxx.h该系列通用
附件是头文件
22:41 上传
点击文件名下载附件
8.21 KB, 下载次数: 76
Powered by

我要回帖

更多关于 stc15w4k32s4 串口程 的文章

 

随机推荐