There is no gold standard for this. I personally use the Genrich peak caller to call peaks across the biological replicates for each condition. The tool accepts replicates and then produces a single peak list that represents the reproducible peaks per group. These I merge the peaks of all groups using bedtools merge, write to SAF format like awk 'OFS="\t" {print $1_"$2"_"$3, $1, $2, $3, "."}' merged.bed > merged.saf and then use featureCounts to produce a count matrix. The output will be a samples as columns and regions as rows matrix with the raw counts for every region per sample. This you can then read into R and put into any differential analysis tool such as DESeq2. Hope that helps.
Edit1: Genrich has the advantage that it takes replicates and then combines p-values for each of these into a single p-value using Fisher's method. That omits the need for post-hoc filtering and reduces spurious peak calls that are not reproducible between replicates. The main advantage over this in comparison to other filtering approaches is that 1) it does not require aritrary thresholds like "peak must be in 2/3 samples" and 2) it does not require the IDR framework which is commonly used as the current implementation only accepts n=2 even though every proper experiment should at least have a triplicate. Genrich is not published and therefore not peer reviewed so try it out, examine results on a genome browser and decide for yourself.
Edit2: The paper that was linked below mentions the PePr peak caller. This one also accepts replicates but requires an input control which is typically not available for ATAC-seq so don't even try this one.
Thanks ATpoint, would it be different for biological replicates rather than technical? I have three biological replicates per condition.
I was indeed referring to biological replicates.