sampwmc.c

来自「At91sam7s64+ucosII+pid温度控制」· C语言 代码 · 共 95 行

C
95
字号
#include "AT91SAM7S128.h"
#include "..\app\Pid.h"
#include "SAMpwmc.h"
extern pid *pp;
void PWMCinit()
{
  // clock
 AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PWMC); // PWC0
  // pin
// AT91C_BASE_PIOA->PIO_PDR=(1<<7);
// AT91C_BASE_PIOA->PIO_BSR=(1<<7);  // PWM3(PA7)
 
 AT91C_BASE_PIOA->PIO_PDR=SSR_SETOUT;
 AT91C_BASE_PIOA->PIO_BSR=SSR_SETOUT;  // pa11 12 13 14
 AT91C_BASE_PWMC->PWMC_DIS=0x0f;		//disable pwm 
 //AT91C_BASE_PWMC->PWMC_MR=(0x0A<<8)|(30); // diva = 1 is 46800 Hz
 //clk is select  clka .46800/30 = 1560.  cprd is 65536,so pwm cycle is 42sec
 
 
 //AT91C_BASE_PWMC->PWMC_MR=(0x08<<8)|(1); //pwm时钟选择clka。频率是mck/256=47923200/256=187200
 //pwm周期是350mS
AT91C_BASE_PWMC->PWMC_MR=(0x0a<<0x08)|(1);  //350 * 2 ms
 AT91C_BASE_PWMC->PWMC_IDR=0x0F;		//中断禁止
 
  AT91C_BASE_PWMC_CH0->PWMC_CMR=0x020b;	//select clka 高电平起始
 AT91C_BASE_PWMC_CH0->PWMC_CDTYR=0x0000;	//duty is about 50ms
 AT91C_BASE_PWMC_CH0->PWMC_CPRDR=0xffff; 	//pwmc cycle is 100ms
 
  AT91C_BASE_PWMC_CH1->PWMC_CMR=0x020b;	//select clka
 AT91C_BASE_PWMC_CH1->PWMC_CDTYR=0x0000;
 AT91C_BASE_PWMC_CH1->PWMC_CPRDR=0xffff; 
 
  AT91C_BASE_PWMC_CH2->PWMC_CMR=0x020b;	//select clka
 AT91C_BASE_PWMC_CH2->PWMC_CDTYR=0x0000;
 AT91C_BASE_PWMC_CH2->PWMC_CPRDR=0xffff; 
 
 
 AT91C_BASE_PWMC_CH3->PWMC_CMR=0x020b;	//select clka
 AT91C_BASE_PWMC_CH3->PWMC_CDTYR=0x0000;
 AT91C_BASE_PWMC_CH3->PWMC_CPRDR=0xffff; 
 
 
 //AT91C_BASE_PWMC->PWMC_IER=AT91C_PWMC_CHID2; 
}

void PWMCISR(void)
{
	if(AT91C_BASE_PWMC->PWMC_ISR & AT91C_PWMC_CHID2)		//pwm2 isr
	{
		{
			PWMCduty(AT91C_PWMC_CHID2,(short) pp->ut); 
		}
	}
}

void PWMCduty(int n,int val)
{
	switch(n)
	{
		case AT91C_PWMC_CHID0:
			AT91C_BASE_PWMC_CH0->PWMC_CUPDR = val;
		break;
		case AT91C_PWMC_CHID1:
			AT91C_BASE_PWMC_CH1->PWMC_CUPDR = val;
		break;
		case AT91C_PWMC_CHID2:
			AT91C_BASE_PWMC_CH2->PWMC_CUPDR = val;
		break;
		case AT91C_PWMC_CHID3:
			AT91C_BASE_PWMC_CH3->PWMC_CUPDR = val;
		break;
		default:
		break;
	}
}
void PWMCIsrEn(char val)		//pwm interrupt enable
{
	AT91C_BASE_PWMC->PWMC_IER=val; 
}
void PWMCIsrDis(char val)
{
	AT91C_BASE_PWMC->PWMC_IDR=val; 
}
void PWMCon(char val)		//使能通道val的pwm控制器。val为:1,2,4,8,控制pwm0,1,2,3
{
//	 AT91C_BASE_PWMC_CH2->PWMC_CMR=0x020b;
	 AT91C_BASE_PWMC->PWMC_ENA=val;
}
void PWMCoff(char val)		//关闭通道val的pwm控制器。val为:1,2,4,8
{
	 
	 AT91C_BASE_PWMC->PWMC_DIS=val;
//	 AT91C_BASE_PWMC_CH2->PWMC_CMR=0x020b;

}

⌨️ 快捷键说明

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