stm32f407能同时控制几个舵机,怎么控制的?



				
				
艾吃艾美
5285 次浏览 2024-05-12 提问
76

最新回答 (4条回答)

2024-05-12 回答

用mega16产生中断,有溢出中断,比较中断等,主要就是用这两种来产生方波。溢出中断:用溢出中断就完全受到计时器计时周期的束缚,比如,从1计到256用了大约8ms,之后产生         溢出中断并重新从1开始计时,此时你可以在每次溢出中断发生的时候让电平反转一次,也可以隔几个中断让电平反转一次,可以用一个全局变量来控制,比如:uint32_t count1=0;uint32_t count2=0;//count1用来设置高电平持续时间,count2用来设置低电平持续时间PA0=1;//刚开始。PA0置高电平ISR(SIG_OVERFLOW0)//256分频,计数器加1大约为0.032ms,78对应2.5ms,250对应8ms{ count1+=1;        count2+=1;                if(count1<=2&&PA0==1)                  PA0=1;//简化的写法,意思是count1还没过时,PA的0位引脚保持高电平       else if(count1>2&&PA0==1){                PA0=0;//count1过时了,PA的0位引脚变成低电平,由count2接管        else if(count2<=4&&PA0==0)                 PA0=0;         else if(count2>4&&PA0==0){                     PA0=1;//count2过时了,PA0重新回到高电平,由count1接管             count1=0;                    count2=0;}           else                            ;//空语句}//end ISR这个例子也许写的漏洞百出,但你可以看出一点端倪,用中断定时,高电平时间和低电平时间都只能是定时器周期的整数倍。因为只有当定时器经过一整个周期,产生溢出中断时才会转入ISR中断服务程序,从而让我们可以反转电平产生方波波形。现在你可能有点懂我的意思了,你再看看比较匹配中断:计时器从1计到256(假定),中途如果与OCR0(假定)相比较,匹配的话就会产生比较匹配中断,还是假设256分频,计数器加1大约为0.032ms,78对应2.5ms,250对应8ms你看舵机驱动我们需要高电平1.5ms~2.5ms来控制0~180度转向,同时整个周期要保持在20ms,对吧我们再来算一下,256分频,计时器每加一,就是大约0.032ms,要达到1.5ms,差不多计数49次,2.5ms,对应计数约80次,20ms对应计数约645次。1.5~2.5ms之间安插了180度角,对吧,一度角差不多0.00555556ms,用256分频的话不切实际,我们换用8分频,分频后频率是1MHz,计数器加一耗时约0.000954ms,要达到1.5ms,差不多计数1573次,2.5ms,对应计数约2621次。1.5~2.5ms之间安插了180度角,一度角差不多0.00555556ms,差不多相当于计数6次的时间差。我的主要方法是:用多个全局变量控制多个舵机。有多少个电机,就用多少个全局变量,比如舵机1,舵机2,,,,舵机100.。。然后,由于1.5ms,2.5ms,20ms,都差不多是计数6次的时间0.00555556ms的整数倍,所以我们就以6为基数,让每计数六次产生一次比较中断,每次中断,所有全局变量都加1,然后用不同的全局变量的值来决定具体哪个舵机受到本次中断的影响。回到溢出中断的例子,你看看:ISR(SIG_OVERFLOW0)//256分频,计数器加1大约为0.032ms,78对应2.5ms,250对应8ms{ count1+=1;        count2+=1;                if(count1<=2&&PA0==1)                  PA0=1;//简化的写法,意思是count1还没过时,PA的0位引脚保持高电平       else if(count1>2&&PA0==1){                PA0=0;//count1过时了,PA的0位引脚变成低电平,由count2接管        else if(count2<=4&&PA0==0)                 PA0=0;         else if(count2>4&&PA0==0){                     PA0=1;//count2过时了,PA0重新回到高电平,由count1接管             count1=0;                    count2=0;}           else                            ;//空语句}//end ISR每次count1,count2都一起加1,刚开始是高电平,当count1增加到3时高电平结束,count2则增加到5时低电平结束,到这时二者都清零,然后一切又周而复始多个舵机也是一样的,假设两个全局变量控制一个舵机,其中一个控制高电平另一个控制低电平,则很多个舵机就有很多对全局变量。每次比较匹配中断时所有变量都+1,然后每个变量加到某个数值时触发“电平变化”,然后控制某个舵机的那一对脉冲经过自己的一个周期后清零就可以了,就像上面程序中那样。多个舵机跟一个舵机没啥大区别,就是全局变量有点晕人而已。做机器人用的舵机多了,不仅编程要细心一点,还要算好舵机之间的角度关系式,看好哪些个舵机的角度之间有公式联系,尽量减少变量数。数学很重要,编程都是附带的。只要引脚够用,mega16可以控制无限多的舵机,然而舵机数量太多,if判断语句太多,就会导致语句执行时间过长,舵机方波时间精度达不到要求。它们之间会有平衡点的。

2024-05-12 回答

用mega16产生中断,有溢出中断,比较中断等,主要就是用这两种来产生方波。溢出中断:用溢出中断就完全受到计时器计时周期的束缚,比如,从1计到256用了大约8ms,之后产生         溢出中断并重新从1开始计时,此时你可以在每次溢出中断发生的时候让电平反转一次,也可以隔几个中断让电平反转一次,可以用一个全局变量来控制,比如:uint32_t count1=0;uint32_t count2=0;//count1用来设置高电平持续时间,count2用来设置低电平持续时间PA0=1;//刚开始。PA0置高电平ISR(SIG_OVERFLOW0)//256分频,计数器加1大约为0.032ms,78对应2.5ms,250对应8ms{ count1+=1;        count2+=1;                if(count1<=2&&PA0==1)                  PA0=1;//简化的写法,意思是count1还没过时,PA的0位引脚保持高电平       else if(count1>2&&PA0==1){                PA0=0;//count1过时了,PA的0位引脚变成低电平,由count2接管        else if(count2<=4&&PA0==0)                 PA0=0;         else if(count2>4&&PA0==0){                     PA0=1;//count2过时了,PA0重新回到高电平,由count1接管             count1=0;                    count2=0;}           else                            ;//空语句}//end ISR这个例子也许写的漏洞百出,但你可以看出一点端倪,用中断定时,高电平时间和低电平时间都只能是定时器周期的整数倍。因为只有当定时器经过一整个周期,产生溢出中断时才会转入ISR中断服务程序,从而让我们可以反转电平产生方波波形。现在你可能有点懂我的意思了,你再看看比较匹配中断:计时器从1计到256(假定),中途如果与OCR0(假定)相比较,匹配的话就会产生比较匹配中断,还是假设256分频,计数器加1大约为0.032ms,78对应2.5ms,250对应8ms你看舵机驱动我们需要高电平1.5ms~2.5ms来控制0~180度转向,同时整个周期要保持在20ms,对吧我们再来算一下,256分频,计时器每加一,就是大约0.032ms,要达到1.5ms,差不多计数49次,2.5ms,对应计数约80次,20ms对应计数约645次。1.5~2.5ms之间安插了180度角,对吧,一度角差不多0.00555556ms,用256分频的话不切实际,我们换用8分频,分频后频率是1MHz,计数器加一耗时约0.000954ms,要达到1.5ms,差不多计数1573次,2.5ms,对应计数约2621次。1.5~2.5ms之间安插了180度角,一度角差不多0.00555556ms,差不多相当于计数6次的时间差。我的主要方法是:用多个全局变量控制多个舵机。有多少个电机,就用多少个全局变量,比如舵机1,舵机2,,,,舵机100.。。然后,由于1.5ms,2.5ms,20ms,都差不多是计数6次的时间0.00555556ms的整数倍,所以我们就以6为基数,让每计数六次产生一次比较中断,每次中断,所有全局变量都加1,然后用不同的全局变量的值来决定具体哪个舵机受到本次中断的影响。回到溢出中断的例子,你看看:ISR(SIG_OVERFLOW0)//256分频,计数器加1大约为0.032ms,78对应2.5ms,250对应8ms{ count1+=1;        count2+=1;                if(count1<=2&&PA0==1)                  PA0=1;//简化的写法,意思是count1还没过时,PA的0位引脚保持高电平       else if(count1>2&&PA0==1){                PA0=0;//count1过时了,PA的0位引脚变成低电平,由count2接管        else if(count2<=4&&PA0==0)                 PA0=0;         else if(count2>4&&PA0==0){                     PA0=1;//count2过时了,PA0重新回到高电平,由count1接管             count1=0;                    count2=0;}           else                            ;//空语句}//end ISR每次count1,count2都一起加1,刚开始是高电平,当count1增加到3时高电平结束,count2则增加到5时低电平结束,到这时二者都清零,然后一切又周而复始多个舵机也是一样的,假设两个全局变量控制一个舵机,其中一个控制高电平另一个控制低电平,则很多个舵机就有很多对全局变量。每次比较匹配中断时所有变量都+1,然后每个变量加到某个数值时触发“电平变化”,然后控制某个舵机的那一对脉冲经过自己的一个周期后清零就可以了,就像上面程序中那样。多个舵机跟一个舵机没啥大区别,就是全局变量有点晕人而已。做机器人用的舵机多了,不仅编程要细心一点,还要算好舵机之间的角度关系式,看好哪些个舵机的角度之间有公式联系,尽量减少变量数。数学很重要,编程都是附带的。只要引脚够用,mega16可以控制无限多的舵机,然而舵机数量太多,if判断语句太多,就会导致语句执行时间过长,舵机方波时间精度达不到要求。它们之间会有平衡点的。

2024-05-12 回答

这你应该问专业的人了。

相关问题

页面运行时间: 0.028727054595947 秒