Arduino PWM输出1023分辨率

   讲PWM1023输出之前,我们首先简单了解下UNO的I/O口。

如下板子上标识数字0-13脚,A0-A5脚(也可以称为14-19脚),都可以使用digitalWrite(pin,val)的方式输出,其中pin为0-19脚,val为高或低电平(HIGH/LOW,1/0)。

A0-A5脚可以读取电压,常用来作为读取信号传感器的信号,返回1023值,也就是5V/1023的分辨率,当信号实际电压为2.5V时,读取的信号为2.5/5*1023=512。

3,5,6,9,10,11脚可以进行输出PWM输出,默认满分辨率为255。当输出10格分辨率时analogWrite(pin,10),实际输出电压为10/255*5≈0.2V的电压。

在一些领域,会使用Arduino板作为主控板进行控制,那么255的分辨率显然不够用(每增加1格分辨率输出,电压就会增加0.2V,这个电压对于需要比较精确控制的终端来说是很大的),所以就需要想办法提高满分辨率,降低每一小格分辨率的电压变化

一下是默认分辨率255的输出情况,Pin 9为输出脚,每间隔1s增加10格输出,视频中可以看出每隔1s,电压增加0.17左右。

QQ视频20231110195734

修改分辨率后的输出,视频中看到每间隔1s增加0.04V电压。相较于255的输出,0.17/0.04≈4倍(对应255*4≈1023),输出分辨率已经提升了4倍。

arduino 1023分辨率间隔1s增加10格输出


const int TopPWM = 1599;  //参考PWM 基本频率设置: 799(20kHz),1599(10kHz)
 
volatile long encoderCounter = 0;          
volatile long encoderTime1, encoderTime2;  
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr,errSum2, lastErr2;

void Compute(int i)    
{ 
   unsigned long now = millis(); 
   double timeChange = max(1, (double)(now - lastTime));
   double dErr;
   double error = Setpoint - Input;
   }   

void analogWriteSAH_Init( void )
{
  TCCR1B = (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (0 << WGM12) | (0 << CS12) | (0<< CS11) | (0 << CS10);
  TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << COM1B1) | (0 << COM1B0) |(1 << WGM11) | (0 << WGM10);     
  ICR1 = TopPWM;
  TCNT1 = 0;
  OCR1A = 0;
  OCR1B = 0;
  TIMSK1 = (0 << ICIE1) | (0 << OCIE1B) | (0 << OCIE1A) | (0 << TOIE1);
  DDRB |= (1 << DDB1);  //Pin 9 Arduino UNO
  DDRB |= (1 << DDB2);  //Pin 10 Arduino UNO
  TCCR1B =
    (0 << ICNC1) | (0 << ICES1) |
    (1 << WGM13) | (1 << WGM12) |             
    (0 << CS12) | (0 << CS11) | (1 << CS10);
}

void analogWriteD9(uint16_t A)
{ OCR1A = constrain(map(A, 0, 1023, 0, TopPWM), 0, TopPWM);}

void analogWriteD10(uint16_t A)
{ OCR1B = constrain(map(A, 0, 1023, 0, TopPWM), 0, TopPWM);}


void setup() {
 
TCCR0B = TCCR0B & B11111000 | B00000011;    
  analogWriteSAH_Init();   //-------- Set PWM frequency for D9 & D10 ----------

TCCR2B = TCCR2B & B11111000 | B00000010;  

    for(int i=5;i<=13;i++)
    pinMode(i, OUTPUT);                          
    Serial.begin(9600);
}

void loop() { int A=0;
              for(int i=0;i<50;i++){ analogWriteD9(A);Serial.println(A);
                                      delay(1000);  A+=10;
                                     }
             }
 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值