舵机怎么控制好?用PCA模块控制怎么调节占空比就是不行
时间:10-02
整理:3721RD
点击:
红色部分就是调节占空比的嘛。但就是不行,怎么控制都不行,呜呜呜....
#include<STC12C5A60S2.H>
#include "Timer0Init.h"
void main() //现在是默认的12T,若AUXR = 0x40;之后则是1T
{
int i;
Timer0Init();
CMOD=0x04; // Setup PCA timer PCA 在空闲模式下停止 PCA 计数器工作
//PCA 时钟源为 定时器0 (T0) 的溢出率
//禁止 PCA 计数器溢出(CH,CL 由 FFFFH 变为 0000H 时)中断
CCON=0x00; //CF = 0,清0 PCA 计数器溢出中断请求标志位
//R = 0, 不允许 PCA 计数器计数
//清0 PCA 各模块中断请求标志位,如 CCF1,CCF0
CL=0x00; //PCA计数器寄存器,当CCAP0L小于CL时,低电平,高于,高电平
CH=0x00;
CCAPM0=0x42; //0100,0010 Setup PCA module 0 in PWM mode
PCA_PWM0=0x00;
CR=1; //Start PCA Timer.
while(1)
{
CCAP0H=235;
for(i=20;i>0;i--);
CCAP0H=230;
for(i=20;i>0;i--);
}
}
#include<STC12C5A60S2.H>
#include "Timer0Init.h"
void main() //现在是默认的12T,若AUXR = 0x40;之后则是1T
{
int i;
Timer0Init();
CMOD=0x04; // Setup PCA timer PCA 在空闲模式下停止 PCA 计数器工作
//PCA 时钟源为 定时器0 (T0) 的溢出率
//禁止 PCA 计数器溢出(CH,CL 由 FFFFH 变为 0000H 时)中断
CCON=0x00; //CF = 0,清0 PCA 计数器溢出中断请求标志位
//R = 0, 不允许 PCA 计数器计数
//清0 PCA 各模块中断请求标志位,如 CCF1,CCF0
CL=0x00; //PCA计数器寄存器,当CCAP0L小于CL时,低电平,高于,高电平
CH=0x00;
CCAPM0=0x42; //0100,0010 Setup PCA module 0 in PWM mode
PCA_PWM0=0x00;
CR=1; //Start PCA Timer.
while(1)
{
CCAP0H=235;
for(i=20;i>0;i--);
CCAP0H=230;
for(i=20;i>0;i--);
}
}
这是我的代码,但是只有8位的精度不知道能帮得了你不。
- #include "reg52.h"
- #include "intrins.h"
- typedef unsigned char uchar;
- typedef unsigned int uint;
- ///*Declare SFR associated with the PCA */
- //sfr CCON = 0xD8; //PCA control register
- //sbit CCF0 = CCON^0; //PCA module-0 interrupt flag
- //sbit CCF1 = CCON^1; //PCA module-1 interrupt flag
- //sbit CR = CCON^6; //PCA timer run control bit
- //sbit CF = CCON^7; //PCA timer overflow flag
- //sfr CMOD = 0xD9; //PCA mode register
- //sfr CL = 0xE9; //PCA base timer LOW
- //sfr CH = 0xF9; //PCA base timer HIGH
- //sfr CCAPM0 = 0xDA; //PCA module-0 mode register
- //sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW
- //sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH
- //sfr CCAPM1 = 0xDB; //PCA module-1 mode register
- //sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW
- //sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH
- //sfr PCAPWM0 = 0xf2;
- //sfr PCAPWM1 = 0xf3;
- //sfr AUXR = 0x8e;
- ////sbit EPCA_LVD = IE^6;
- sbit pwm_0 = P0^0;
- uint num = 1;
- uchar pos = 9;
- //void Timer0Init(void)
- //{
- // AUXR &= 0x3F;
- // TMOD &= 0xF0;
- // TMOD |= 0x02;
- // TL0 = 0xb2; //178 f = 50HZ
- // TH0 = 0xb2;
- // TF0 = 0;
- // TR0 = 1;
- //}
- //void PCA_init(void)
- //{
- // CCON = 0; //Initial PCA control register
- // //PCA timer stop running
- // //Clear CF flag
- // //Clear all module interrupt flag
- // CL = 0; //Reset PCA base timer
- // CH = 0;
- // CMOD = 0x05; //Set PCA timer clock source as Timer0
- // //Disable PCA timer overflow interrupt
- // CCAPM0 = 0X42;
- // CCAPM1 = 0X42;
- // CCAP0L = 0XFF;
- // CCAP0H = 0Xfa;
- // CCAP1L = 0XFF;
- // CCAP1H = 0XFF;
- // PCAPWM0 = 0X00;
- // PCAPWM1 = 0X00;
- // CR = 1;
- //}
- void timer0_init(void)
- {
- TMOD = 0x01;
- TH0 = (65535 - 10) / 256;
- TL0 = (65535 - 10) % 256;
- TR0 = 1;
- EA = 1;
- ET0 = 1;
- }
- void main()
- {
- uint i, j;
- uchar flag = 1 , pwm_0 = 0;
- timer0_init();
- while(1)
- {
- if (flag == 1)
- {
- pos++;
- if(pos >= 1000)
- {
- flag = 0;
- }
- for (i = 0; i < 60; i++)
- {
- for (j = 0; j < 60; j++);
- }
- }
-
- if (flag == 0)
- {
- pos--;
- if (pos<= 9)
- {
- flag = 1;
- }
- for (i = 0; i < 60; i++)
- {
- for (j = 0; j < 60; j++);
- }
- }
- }
- // Timer0Init();
- // PCA_init(); //0.46ms~2.5ms 0xfa~0xe0
- // while(1)
- // {
- // if (flag == 1)
- // {
- // CCAP0H--;
- // if (CCAP0H <= 0xe0)
- // {
- // flag = 0;
- // }
- // for (i = 0; i < 6000; i++)
- // {
- // for (j = 0; j < 60; j++);
- // }
- // }
- // if (flag == 0)
- // {
- // CCAP0H++;
- // if (CCAP0H >= 0xfa)
- // {
- // flag = 1;
- // }
- // for (i = 0; i < 6000; i++)
- // {
- // for (j = 0; j < 60; j++);
- // }
- // }
- // }
- }
- //void PCA_inter() interrupt 6
- //{
- // if (CF == 1)
- // {
- // CF = 0;
- //
- // if (CCAP0H != 0)
- // {
- // CCAP0H--;
- // }
- // else
- // {
- // CCAP0H = 0xff;
- // }
- //
- // if (CCAP1H != 0)
- // {
- // CCAP1H--;
- // }
- // else
- // {
- // CCAP1H = 0xff;
- // }
- // }
- //}
- void timer0_isr(void) interrupt 1
- {
- TH0 = (65535 - 10) / 256;
- TL0 = (65535 - 10) % 256;
- TR0 = 0;
- num++;
- if (num >= 1165)
- {
- num = 0;
- }
- if (num >= pos) //0.5ms 9 2.5ms 45
- {
- pwm_0 = 0;
- }
- else
- {
- pwm_0 = 1;
- }
- TR0 = 1;
- }
这个pca被注释掉了,换成了定时器产生。你不管定时器一,剩下的就是PCA使用定时器0产生周期50HZ的PWM。使用晶振12M
你直接看while(1)里面被注释掉的就对了