久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5134|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

avr單片機(jī)m16用一個(gè)定時(shí)器實(shí)現(xiàn)一個(gè)多個(gè)電位器控制多個(gè)舵機(jī)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:206921 發(fā)表于 2017-6-1 23:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近在研究多個(gè)舵機(jī)的控制,上網(wǎng)找了很多資料,編寫(xiě)了一個(gè)程序,用三個(gè)電位器分別控制三個(gè)舵機(jī),只用tc0定時(shí)計(jì)數(shù)器,最后無(wú)法實(shí)現(xiàn),原理是對(duì)的,不知道哪里出了問(wèn)題,程序如下:
#include <iom16v.h>
#include <macros.h>
#include "1602LCD_drive.h"
//unsigned char line1_data[]={"ADC1:"};     //
//unsigned char line2_data[]={"ADC3:"};          
//unsigned char line3_data[]={"ADC2:"};                     
#define  uchar unsigned char
#define  uint  unsigned int
#define OUTPUT PORTC
#define SER0 0x01
#define SER1 0x02
#define SER2 0x04
#define ADCN ADMUX
#define ADC0 0x40
#define ADC1 0x41
#define ADC2 0x42
char Counter=1;
char num=0;
char time=0;
       

/************延時(shí)函數(shù)***********/
void delay(unsigned int ms)
{
        unsigned int i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}
/*********端口設(shè)置函數(shù)*********/
void port_init(void)
{
     PORTB=0XFF;                        //設(shè)置1602端口的
     DDRB=0XFF;
    DDRD=0XFF;       
    PORTD=0Xff;       
    DDRC=0XFF;               //設(shè)置pc口為舵機(jī)pwm輸出
    PORTC|=0X00;
    DDRA&=0X00;                     //adc口設(shè)為輸入,帶上啦電阻
    PORTA|=0Xff;
}
void timer0_init()
{
        SREG=0X80;
        TIMSK|=(1<<TOIE0);                //是能溢出中斷
        TCCR0|=(0<<CS02)|(0<<CS01)|(1<<CS00); //12mhz晶振  無(wú)預(yù)分頻60/12m=5us
        TCNT0=0;                          //計(jì)數(shù)器初值
}

/**********ad轉(zhuǎn)換函數(shù)**********/
unsigned int adc_()
{
         unsigned int addata;                                
         ADMUX=0X40;                                          //AVCC為基準(zhǔn)電,AD0為輸入通道 01000010
         ADCSRA=0XC0;                                         //使能ADC,自動(dòng)連續(xù)轉(zhuǎn)換 11000000
         ADCSRA|=BIT(ADSC);                                //開(kāi)始A/D轉(zhuǎn)換
         while(!(ADCSRA&(BIT(ADIF))));        //等待轉(zhuǎn)換完成
         addata=ADCL;                                //獲取ADC結(jié)果
         addata=addata+ADCH*256;
         return addata;                        //返回ADC值
}   

/**ADC通道轉(zhuǎn)換函數(shù)**/
uint adc_change()
{
     unsigned int ada, adcx;
         ada=adc_();
         adcx=ada/2.5+100;
         return adcx;
}


/********************主函數(shù)**********************/
void main()
{
        port_init();
        adc_();
        timer0_init();
       
        adc_change();
}

#pragma interrupt_handler timer0_ovf:10
void timer0_ovf()
{   
         TCNT0=196;            //重新賦值256-196=60,溢出一次等于5us
         adc_change();           //adc值轉(zhuǎn)換成counter計(jì)數(shù)值最大值
     Counter++;
         time++;            
         if(num==0&&Counter<=1)          //這里
         {
             ADCN=ADC0;                                 //設(shè)置adc通道為adc0
             OUTPUT|=SER0;                                  //輸出口為PC0
                 //k[0]=adc_change()/100;
             //k[1]=(adc_change()%100)/10;
             //LCD_write_char(14,1,k[0]+0x30);
             //LCD_write_char(15,1,k[1]+0x30);
                 
         }
                 
         if(num==1&&Counter<=1)
         {
             ADCN=ADC1;                 //adc通道為adc1
             OUTPUT|=SER1;           //修改輸出口為pc1
                 //k[0]=adc_change()/100;
             //k[1]=(adc_change()%100)/10;
             //LCD_write_char(5,1,k[0]+0x30);
             //LCD_write_char(6,1,k[1]+0x30);
               
         }
if(num==2&&Counter<=1)
         {
             ADCN=ADC2;           //adc通道為adc2
             OUTPUT|=SER2;            //輸出口為pc2
         }
if(Counter>=adc_change())          //如果計(jì)數(shù)值大于adc轉(zhuǎn)換值
         {     
                 OUTPUT&=0X00;                   //所有輸出口拉低
                 num=num+1;                     //num+1
                 Counter=0;                      //重新計(jì)數(shù)
                  if(num>=3)                       //num大于三所有c口拉低
                 OUTPUT&=0X00;
         }
       
         if(time>=4000)                //計(jì)數(shù)達(dá)到4000?4000*5us=20000us=20ms為舵機(jī)周期
        {
                 num=0;                     //全部重新賦值                       
                 time=0;
                  Counter=0;   
    }
}

小白一個(gè),求大神指教!








分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:207004 發(fā)表于 2017-6-2 10:49 | 只看該作者
你可以用pmw波控制舵機(jī)

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:207029 發(fā)表于 2017-6-2 11:44 | 只看該作者
你的問(wèn)題很籠統(tǒng)!具體怎么無(wú)法實(shí)現(xiàn)?有哪些錯(cuò)誤?體現(xiàn)在哪里?原理圖可否曬出來(lái),否則怎么幫助你?單片機(jī)這個(gè)東西定制性很強(qiáng),你單單拿出個(gè)程序我想神仙也幫不了你!

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:206921 發(fā)表于 2017-6-2 13:07 | 只看該作者
jlqiu 發(fā)表于 2017-6-2 10:50
你可以用pmw波控制舵機(jī)

那個(gè)我會(huì),現(xiàn)在要實(shí)現(xiàn)的是多個(gè)電位器分別控制多個(gè)舵機(jī),采用的是模擬pwm波形,而不是用定時(shí)器的快速pwm

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:206921 發(fā)表于 2017-6-2 14:05 | 只看該作者
zt2017 發(fā)表于 2017-6-2 11:44
你的問(wèn)題很籠統(tǒng)!具體怎么無(wú)法實(shí)現(xiàn)?有哪些錯(cuò)誤?體現(xiàn)在哪里?原理圖可否曬出來(lái),否則怎么幫助你?單片機(jī)這 ...

你說(shuō)的對(duì),具體如下
m16芯片,12mhz晶振,電位器3個(gè),舵機(jī)三個(gè),
單片機(jī)的PA0~PA2口作為ADC輸入通道,分別接三個(gè)電位器,采用單端接入法,
PC0~PC2為舵機(jī)信號(hào)輸出腳,分別鏈接三個(gè)舵機(jī)的信號(hào)線
程序思路是這樣
設(shè)置定時(shí)器溢出中斷,使能ADC轉(zhuǎn)換,把得到的ADC值0~1000,通過(guò)adc_change()函數(shù)轉(zhuǎn)化成100~500,100*5us=0.5ms,500*5us=2.5ms,就是一個(gè)舵機(jī)的脈沖周期,
例如第一次轉(zhuǎn)換是ADC0,舵機(jī)通道SER0(pc0)電平拉高,得到的adc_change()的值為200(相當(dāng)于脈沖周期200*5us=1ms),賦給Counter,定時(shí)器TCNT0初值為196,經(jīng)過(guò)200次溢出,Counter的值達(dá)到200,
執(zhí)行Counter清零,ADCN(ADC輸入通道選擇)重新賦值為ADC1,舵機(jī)通道SER1(pc1)拉高,
此時(shí)讀取ADC1的值,賦給Counter,再執(zhí)行如上指令,直到第三通道的舵機(jī)脈沖完成,num大于3,所有pc口拉低
程序中每次計(jì)數(shù)器溢出,time+1,溢出4000次(4000*5us=20ms),為一個(gè)舵機(jī)控制周期,超過(guò)4000,次,time,Counter等清0,重新計(jì)數(shù)。

程序最后測(cè)試結(jié)果為,pc0端口保持高點(diǎn)平,pc1,pc2保持低電平,舵機(jī)就沒(méi)反應(yīng),電位器都檢查了,電路連接良好?赡苁浅绦虺鲥e(cuò)。

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:207004 發(fā)表于 2017-6-5 15:52 | 只看該作者
HYH520 發(fā)表于 2017-6-2 13:07
那個(gè)我會(huì),現(xiàn)在要實(shí)現(xiàn)的是多個(gè)電位器分別控制多個(gè)舵機(jī),采用的是模擬pwm波形,而不是用定時(shí)器的快速pwm

用仿真軟件調(diào)試過(guò)嗎?輸出方波符合舵機(jī)波形嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:206921 發(fā)表于 2017-6-12 12:26 | 只看該作者
已實(shí)現(xiàn)八個(gè)電位器分別同時(shí)控制八個(gè)舵機(jī),請(qǐng)看新帖
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久欧美高清二区三区 | 日韩成人中文字幕 | 精品日韩一区 | 国产精品99久久久久 | 日韩视频在线免费观看 | 日韩毛片中文字幕 | 日韩精品极品视频在线观看免费 | 日韩a在线观看 | 99热这里都是精品 | 欧美老少妇一级特黄一片 | jlzzjlzz国产精品久久 | 国产精品久久久久久亚洲调教 | 视频一二区 | 激情五月综合 | 国产一级成人 | avtt国产| 久久一区二区三区四区五区 | 一级毛片观看 | 天天操网| 亚洲 中文 欧美 日韩 在线观看 | 韩国av电影网| 欧美一区二区三区在线视频 | 黄色网络在线观看 | 影音先锋成人资源 | 久久免费视频观看 | 美女久久久久久久 | 亚洲成人毛片 | 精品一区二区在线观看 | 国产成人精品一区二区三区四区 | 欧美日日日日bbbbb视频 | 日韩中文在线观看 | 久久中文一区二区 | 久久成人免费 | 欧美成人精品一区二区男人看 | 亚洲第一区国产精品 | 久久久久久久国产精品影院 | 久久久国产一区二区三区 | 久草成人网 | 欧美色专区 | 91精品国产乱码久久久久久 | 成人永久免费视频 |