完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include float jiaodu[3][18]={ -9.2,-7.5,-4.9,-1.8,1.7,5.0,7.6,9.2,9.8,9.2,7.5,4.9,1.8,-1.7,-5.0,-7.6,-9.2,-9.8, 18.0,10.0,0.4,-8.8,-16.0,-21.1,-10.0,-0.4,8.8,-24.4,16.0,21.1,24.4,24.9,22.9,-24.9,-22.9,-18.0, 39.1,42.1,-42.1,-38.3,38.3,25.9,7.7,-7.1,-17.0,-25.1,-32.7,-39.1, -25.9,-7.7,7.1,17.0,25.1,32.7, };//三个舵机在十八个离散位置的角度, int i=-1,a=0; //计数器寄存器设置 void timer1_init(void) { TCCR1A = 0xAA;//快速pwm波,比较匹配时清零OCR1ACR1BOCR1C,在top时置位OCR1ACR1BOCR1C TCCR1B = 0x1A;//8分频,top由ICR1设置 TCNT1H =0 ; //TCNTn为定时器的计数初值 TCNT1L = 0;//一定要分高低位设置,虽然是0 ICR1=2473;//,pwm波位50HZ, 由PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))可计算出top值 OCR1A= 187;//初始化舵机转到0°位置(-90°~90°),(0.5+2.5)*36750/20/2=2756 OCR1B= 187; OCR1C= 187; } //中断程序 #pragma interrupt_handler timer1_ovf_isr:15//每个中断都有与之对应的中断向量,如这句中的15,具体请看技术手册。 void timer1_ovf_isr(void) { a++; if(a==45)//中断每发生45次改变占空比,通过改变a的值可以改变舵机摆动的速度 { a=0; i++; if(i>17)//依次把十八个值循环调用 i=0; OCR1A = (jiaodu[0][i]*125)/90+187;//把角度转换成匹配值赋值给寄存器,转换公式根据不同的舵机以及不同的top值有相应比变化, OCR1B = (jiaodu[1][i]*125)/90+187; OCR1C = (jiaodu[2][i]*125)/90+0; } } //中断寄存器设置 void init_devices(void) { timer1_init();//调用计数器寄存器设置函数 MCUCR = 0x00;//MCU控制寄存器 TIMSK = 0x04;//中断屏蔽寄存器、计数器1溢出中断使能 SEI(); //全局中断使能 } void main(void) { DDRB = 0xE0;//把PB5/PB6/PB7口设置为输出 init_devices();//中断寄存器设置函数 while(1) ; } 不进入中断程序,恳请各位高手多多指点,必有重谢! |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5120 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7766 浏览 0 评论
3020 浏览 2 评论
3101 浏览 1 评论
10050 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 10:34 , Processed in 0.557084 second(s), Total 98, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号