⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 用iAR编写的AD转换程序
💻 C
字号:
#include "includes.h"
//#include "uart.h"
#include "adc.h"
//#include "display.h"
/*
#define Com  1
#define Dat  2
#define BaudRate 0x07
*/
void main(void);
void TargetInit(void);
//void DisplayInit(void);
void AdInit(void);
void PwmOut(uchar pwm);
void OSTimeTick(void);


//extern uchar UartRxBuf[RX_BUFFER_SIZE];
//extern uchar UartRxCount;
//extern uchar UartRxFlag;
//extern uchar UartTxBuf[TX_BUFFER_SIZE];               /* 256 bytes UART transmit buffer                   */
//extern uchar UartTxRdPtr;                            /* UART transmit buffer read pointer                */
//extern uchar UartTxWrPtr;                            /* UART transmit buffer write pointer               */
//extern uchar UartTxCount;                            /* Number of characters to send                     */

extern uchar AdReBuf[AD_BUF_SIZE];
extern uchar AdCount;
extern uchar AdComFlag;
extern uchar FisrtAdComFlag;

//uchar worktime;
//uchar ledtime;
uchar adtime;

uchar AdResult;
uchar AdResult0;
uchar AdResult1;

void OSTimeTick(void)
{
  //worktime++;
  //ledtime++;
  adtime++;
}

void TargetInit(void)
    {
    DDRD  = 0xff;
    PORTD = 0x00;
    
    TIMSK  = 0x00;
    TCCR1B = 0x00; 
    TCNT1H = 0x00; 
    TCNT1L = 0x00;
    OCR1AH = 0x00;
    OCR1AL = 0x7f;
    OCR1BH = 0x00;
    OCR1BL = 0x7f;
    ICR1H  = 0x00;
    ICR1L  = 0xFF;
    TCCR1A = ((1<<COM1A1)|(1<<COM1B1));
    TCCR1B = (1<<WGM13)|(1<<CS10); //start Timer
    
    //UCSRA       = (1<<U2X);
    //UCSRB       = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE);
    //UCSRC       = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    //UBRRL       = BaudRate;                                   /* 19200 BAUD at 4.0MHz                             */
    
    
    //UartRxFlag  = 0;                                    /* Clear number of characters to send               */
    //UartRxCount = 0;                                    /* Initialize transmit buffer read pointer          */
    //UartTxCount = 0;                                    /* Clear number of characters to send               */
    //UartTxRdPtr = 0;                                    /* Initialize transmit buffer read pointer          */
    //UartTxWrPtr = 0;  
    
    TCCR0       = 0x05;                                 /* Set TIMER0 prescaler to CLK/1024 */
    TCNT0       = 256-(7372800/1000/1024);                 
    TIMSK       = 0x01;                                 /* Enable TIMER0 overflow interrupt                 */
    
    WDTCR = (1<<WDE)|(1<<WDP1);
    
    //DisplayInit();
    AdInit(); //调用AD初始化
    }
void AdInit(void)
{
    ADMUX           = (1<<REFS0)|(1<<ADLAR);
    ADCSRA          = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
    AdCount         = 0; 
    AdComFlag       = 0;
    FisrtAdComFlag  = 0;
}
/*
void DisplayInit(void)
{
    DDRB  = (1<<Gate1)|(1<<Gate2)|(1<<Gate3)|(1<<Gate4);
    PORTB = 0x0f;
    DDRC  = (1<<DispClk)|(1<<DispData);
    PORTC &= ~(1<<DispClk);
    PORTC &= ~(1<<DispData);
} 
*/   
void PwmOut(uchar pwm)
    {
    uchar temp;
    
    if((pwm >= 0xF5)){
        temp = 0xF5;
    }else if(pwm <= 0x0A){
        temp = 0x0A;
    }else{
        temp   =  pwm;
    }
    
    
    OCR1AH =  0x00;
    OCR1AL =  temp;
    OCR1BH =  0x00;
    OCR1BL =  temp;
    }
void main(void)
    {
    uchar temp;
    
    _CLI();     //清中断
    TargetInit();//调用初始化
    //Display(12345,Gate1);
    //worktime  =  0;
    //ledtime   =  0;
    adtime    =  0;
    AdResult  =  0;
    AdResult0 =  0;
    AdResult1 =  0;
    _SEI();//开中断
    
    _WDR();
    
    FirstAd();//开始第一次AD转换
    
    _WDR();
    while(1)
        {
            _WDR();
            
        /*
           if(worktime > 5) {
               worktime = 0;
               if(UartRxFlag == 1){
                   switch(UartRxBuf[Com])
                      {
                      case 0x44:
                          PutChar(OCR1AL);
                          UartRxFlag = 0;
                          break;
                      #if (UART_CHANGE_PWM_EN > 0)   
                      case 0x55:
                          PwmOut(UartRxBuf[Dat]);
                          UartRxFlag = 0;
                          break;
                      #endif    
                      case 0x66:
                          PutChar(AdResult);
                          UartRxFlag = 0;
                          break;
                      }
                } 
            }
            */
            
            if(adtime > 2) {
                _WDR();
                AdResult0 = ReadAd(0);
                AdResult1 = ReadAd(1);
                if(AdResult0 > AdResult1){
                    temp  =  (AdResult0 >> 1);
                    AdResult = 0x7F - temp;
                }else {
                    temp  =  (AdResult1 >> 1);
                    AdResult = 0x7F + temp;
                }
                adtime   = 0;
                #if (AD_CHANGE_PWM_EN > 0)
                if(AdResult != OCR1AL)
                    PwmOut(AdResult);
                #endif
                _WDR();
               
                
                /*
                if(AdResult != OCR1AL){
                    temp = AdResult * 196;
                    Display(temp , Gate1);
                }  
                */  
                //PutChar(AdResult);
            }
            
        }
    }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -