/ C语言的printf中的格式字符 /
printf(格式控制, 输出列表)
e格式符:用%e指定以指数形式输出实数
实数占13列,一般自动给出的数字部分的小数位数为6位,指数部分占5列(如“e+002”,其中e占一列,指数符号占一列,指数占三列)
例如 printf(“%e”,123.456);
输出为:
1.234560e+002
也可用“%m.ne”形式的格式声明
例如 printf(“%13.2e”, 123.456)
输出为:
1.23e+002 (数的前面有四个空格)
O格式符:以八进制的格式输出,存储在四个字节里,在内存单元中实际的二进制数从右往左按3位一组构成一个八进制数
X格式符:以十六进制数形式输出整数
/ C语言的scanf中的格式字符 /
scanf(格式控制, 地址列表)
例如: scanf(“a=%f, b=%f”, &a, &b);
输入时在同样的位置输入同样的字符,即
a=1, b=2, c=3 (连逗号都不能省!)
/ 字符输入输出函数 /
putchar()
先定义字符变量: char a = ‘B’ 赋予的初值要用单引号括起来。
然后 putchar(a); 则会在显示器上输出B这个符号
getchar()
先定义字符变量: char a;
然后: a = getchar(在键盘上输入一个字符);
最后再: putchar(a);
/ 选择结构和条件判断 /
If语句的常用形式:
一:if(表达式1){语句1}
二:if(表达式1)
语句1;
else
语句2;
三:if (表达式1) 语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;
。。。。。。
else if (表达式n) 语句n ;
else 语句n+1;
条件表达式
条件运算符由“?”和“:”组成
表达式1 ? 表达式2 :表达式3;
例如:a>b ? (max = a) : (max = b);
相当于: if(a>b) max = a;
else max = b;
如果表达式1为真,则执行表达式2;如果表达式1为假,则执行表达式3.
If语句的嵌套
If()
{
if() 语句1
else 语句2
}
else 语句3
switch语句
switch(语句1)
{
case 常量1 : 语句1;break;
case 常量2 : 语句2; break;
……
Case 常量n: 语句n; break;
default : 语句n+1;
}
case后面可不加花括号,它会自动执行case 后的所有语句
也可以多个case标号共用一组执行语句,例如:
case ’A ’:
case ‘ B‘ :
case ‘ C ’: printf(“\n”);break;
…..
/ 零碎的知识 /
return 0;:当main函数执行结束前将整数0作为函数值,返回调用函数处。每一个c语言程序都必须有一个main函数。如果用void main()则可以最后不写return o;
const int:整形常量
复合的赋值运算符:
a+=3 等价于 a=a+3
x*=y+8 等价于 x=x*(y+8)
x%=3 等价于 x=x%3
/调用 Arduino的Stepper库/
Stepper 电机的名字(转子转一圈的步数,开发板相应引脚一,引脚二,引脚三,引脚四);
上面这个语句用于定义一个步进电机对象
Arduino需要通过ULN2003电机驱动板来控制28BYJ-48
(虽然杜邦线是按顺序接的,但在调用Stepper函数的时候得把引脚二三调换顺序,不然其不能正常运行)
查找Stepper函数源码,源码如下图所示
可发现控制B、C相的C1和C2顺序不对。
图中的时序为: AC-BC-BD-DA
而正确的双四拍时序应该为: AB-BC-CD-DA。
故而需要调换二三引脚的顺序
而且我发现我调用Stepper函数后实际运行时序是BC-CD-DA-AB(按下开发板的复位键后,先亮BC两个灯)。
所以我推测还是是Arduino自带的Stepper库的Stepper函数源码有问题,为验证自己的推测,我写了如下程序
实验结果:电机输出轴逆时针转动;转子转2048步,输出轴转一圈;按下复位键后先亮AB这两个灯,时序为AB-BC-CD-DA
即表明,我的猜想是正确的。
setSpeed(rpm);
rpm:转速参数(每分钟电机转数)(长整形)
上面这个语句用来设定步进电机的运行速度。
step(steps);
用来让步进电机转子旋转相应的步数。此函数为“blocking”类型函数,要等待电机执行完以后才能进行下一条语句。为了更好的控制,可以在调用step函数时尽量让电机少执行步数。
steps是int型参数,表示步数,其正值是逆时针转,负值是顺时针转。
用setSpeed和 step函数前,要先写步进电机的名字
格式: 步进电机名.setSpeed(100);
在使用Stepper库函数时,程序中的void setup(){}中的{}不需要写入内容
如需控制多个步进电机,可使用第三方库:AccelStepper库
(暂时不学,先尝试自定义步进电机的控制函数,等需要用到的时候再学)
/ 自定义函数控制28BYJ-48 /
前半部分代码是通用的
单相绕组通电四拍时序:A-B-C-D
其中
双相绕组通电四拍时序:AB-BC-CD-DA
双相绕组通电八拍时序:A-AB-B-BC-C-CD-D-DA
而且八拍的时候代码要适当的修改
通过上述程序可完成“全步进小力矩”、“全步进大力矩”、“半步进”的三种模式下的逆时针转动和顺时针转动的动作。
或者用while(1)建立一个死循环,将其放在适当的位置,也可停止电机运行。