4. Const数组存储在内部的flash , 数值表共占用2048字节 。
STM32F103RTC6共256K , 程序组和设置参数占用48K , bootloader程序占用了8K , 远程升级空间占用了100K , 目前应用程序只用到40K左右 。
剩余60K左右的空间 , 腾出2K的空间来存储数值表 , 有空间 , 就是这么任性 。
5. 在中断程序中 , 根据总的更新次数以及当前的更新计数值 , 计算
值 , 再映射到0-1023的数值有的索引值 , 通过索引获取数值 。
6. 需要注意的是stm32f103不支持浮点数的运算 , 所以对于浮点数的运算 , 需要换算成乘以一个数再除以另一个数 , 比如*α , 需要转变为*65535/13107 。
下面一段代码是根据更新的计数值获取频率的函数:
U16 fnMC_GetFreq(U16 n, U16 halftn, U16 alpha, U16 minfreq, U16 maxfreq){//alpha=alpha * 4096 signed int udataA; signed short uiDataA; U16 uiRes; U32 uwData; udataA = (signed int)alpha * (signed int)n; udataA = (signed int)udataA / halftn; if(udataA > 32767){udataA = 32767; } uiDataA = (signed short)alpha - (signed short)udataA; uiDataA = (signed short)4 * 4096 - uiDataA; if(uiDataA < 0){ uiDataA = 0; } uiRes = (U16)uiDataA;uiRes = uiRes / 32;//*1023/8/4096 if(uiRes > 1023){ uiRes = 1023; } udataA = (signed int)(maxfreq - minfreq) * g_mc_uchExp[uiRes]; udataA = udataA / 65535; uiDataA = (signed int)udataA; uiDataA= minfreq; if(uiDataA < 200){ uiDataA = 200; } return(uiDataA); } 下面一段代码是产生步进电机控制信号的PWM周期中断程序:
int data; U16 freq; STRMotorRegs *motor; motor = &g_motor_regs[0]; MOTOR_A_CLEARINT(); motor->steps; data = https://www.haocat.cn/shenghuo/(int)MOTOR_A_STEPS_GET(); if(motor->direction == 0) { data = https://www.haocat.cn/shenghuo/data1;} else { data = data - 1; } MOTOR_A_STEPS_SET(data); freq = motor->runfrequency; if(motor->runstate == MOTOR_RUN_STATE_INC){if(motor->runtimer >= motor->starttime){motor->runstate = MOTOR_RUN_STATE_IDLE;}else{freq = fnMC_GetFreq(motor->runtimer, motor->halfstarttime, motor->alpha, motor->startfreq, motor->runfrequency);//U16 n,U16 halftn,U16 alpha,U16 maxfreq,U16 minfreq)}motor->runsnapfreq = freq; }else if(motor->runstate == MOTOR_RUN_STATE_IDLE){if(motor->totalstep <= (motor->stepsmotor->stopremainstep)){motor->runstate = MOTOR_RUN_STATE_DEC;motor->runtimer = 0;}motor->runsnapfreq = freq; }else{ if(motor->runtimer >= motor->stoptime){freq = motor->stopfreq;}else{freq = fnMC_GetFreq(motor->runtimer, motor->halfstoptime, motor->alpha, motor->runsnapfreq, motor->stopfreq);//U16 n,U16 halftn,U16 alpha,U16 maxfreq,U16 minfreq)} }if(motor->steps >= motor->totalstep) {motor->starting = FALSE; }if(FALSE == motor->starting) { MOTOR_A_DISABLE(); }else{ motor->curfrequency = freq; fnMT_Cal_MotorA_TimeConf(); } 实践 下面是生成S曲线数值表、控制步进电机启动、停止的视频 , 从视频上可以明显看到启动时慢加速->快加速->慢加速的过程 , 以及停止时慢减速->快减速->慢减速的过程 。
猜你喜欢
- 用户账户控制需要关闭吗 用户账户控制
- cmd如何打开MySQL数据库的控制台?cmd打开Python数据库控制台的方法
- 股东是什么意思,控股股东和实际控制人区别
- 什么花的花语是控制
- 刍议无公害茶叶栽培与加工综合控制技术
- 最常用的编程软件 西门子可编程控制器
- 远程控制软件推荐下载 远程控制软件有哪些
- 微信骰子插件怎么添加 微信控制骰子点数设置
- 报道称苹果可能会放松对默认iPhone应用程序的控制
- 多肉什么情况下需要控制浇水
