📄 sampwmc.c
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -